从URL Spring 4中删除GET参数

时间:2015-11-24 23:14:25

标签: spring spring-mvc get multilingual

我的spring应用程序上安装了多语言,我不希望'lang'参数出现在URL中(我使用sessionLocaleResolver存储语言环境或者cookieLocaleResolver /都不起作用)。 我已经搜索了几个小时来找到这个问题的解决方案,虽然显然它应该已经与我所做的一起工作了。这是我的代码:

视图(welcome.jsp):

Language : <a href="?lang=en">English</a>|<a href="?lang=fr_FR">Francais</a>|<a href="?lang=ro_RO">Romanian</a>
<h2>welcome.springmvc : <spring:message code="welcome.text" text="default text" /></h2>

我的servlet.xml

    <!-- Multi-Language / Localization Setup -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean id="localeChangeInterceptor"
            class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptor>
</mvc:interceptors>
<mvc:annotation-driven ignore-default-model-on-redirect="true" />

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>classpath:lang.files/welcome</value>
            <!-- <value>classpath:messages2</value> -->
        </list>
    </property>
    <property name="defaultEncoding" value="UTF-8" />
</bean>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en" />
    <property name="cookieName" value="lang" />
    <property name="cookieMaxAge" value="60000" />
    <property name="cookiePath" value="/" />
</bean>

我的控制器代码 - 请注意,当我点击链接更改语言时,我将停留在同一页面中。因为理想情况下它会是一个下拉列表,我会留在同一页面

@RequestMapping("/welcome")
public ModelAndView helloWorld() {

    String message = "<br/ ><div style='text-align:center;'>"
            + "<h3>********** Hello World, Spring MVC Tutorial</h3></div><br />";

    ModelAndView mv = new ModelAndView();
    // ModelAndView mv = new ModelAndView(new
    // RedirectView("welcome.do", true, true, true));
    RedirectView view = new RedirectView("/welcome", true);
    view.setExposeModelAttributes(false);
    mv.setView(view);

    mv.addObject("message", message);
    mv.addObject("activities", activityService.getAll());
    mv.addObject("act", activityService.getR());

    return new ModelAndView(view);
}

结果是'404'表示找不到'localhost / myapp / welcome'。

最后这个控制器工作,但在URL中添加'lang'参数:

@RequestMapping("/welcome")
public ModelAndView helloWorld() {

    String message = "<br/ ><div style='text-align:center;'>"
            + "<h3>********** Hello World, Spring MVC Tutorial</h3></div><br />";

    ModelAndView mv = new ModelAndView();

    mv.addObject("message", message);
    mv.addObject("activities", activityService.getAll());
    mv.addObject("act", activityService.getR());

    return mv;
}

请帮忙。 谢谢:))

1 个答案:

答案 0 :(得分:1)

@RequestMapping("/welcome")
public ModelAndView helloWorld() {

    String message = "<br/ ><div style='text-align:center;'>"
            + "<h3>********** Hello World, Spring MVC Tutorial</h3></div><br />";

    ModelAndView mv = new ModelAndView();
    // ModelAndView mv = new ModelAndView(new
    // RedirectView("welcome.do", true, true, true));
    RedirectView view = new RedirectView("/welcome", true);
    view.setExposeModelAttributes(false);
    mv.setView(view);

    mv.addObject("message", message);
    mv.addObject("activities", activityService.getAll());
    mv.addObject("act", activityService.getR());

    return new ModelAndView(view);
}

当您一遍又一遍地重定向到/ welcome时,此代码会导致无限循环。

此外,当您获得<a href="?lang=en">English</a>之类的链接时,当您点击它时,该参数将始终显示在网址中。

实现目标的最简单方法(不是最好)是创建另一个控制器方法,如

@RequestMapping("/changeLocale")
public ModelAndView changeLocale() {
    RedirectView redirectView = new RedirectView("/welcome");
    redirectView.setExposePathVariables(false);
    return new ModelAndView(redirectView);
}

链接看起来像

<a href="/changeLocale?lang=en">English</a>|<a href="/changeLocale?lang=fr_FR">Francais</a>|<a href="/changeLocale?lang=ro_RO">Romanian</a>