【问题标题】:Set and read cookies in Spring MVC/Security在 Spring MVC/Security 中设置和读取 cookie
【发布时间】:2013-12-19 12:48:53
【问题描述】:

我是 Spring 新手,我需要在单击“登录”按钮时设置一个自定义 cookie,然后该 cookie 在 web 应用程序中将变为红色。这样做的最佳做法是什么?另外,这带来了一个问题,以后如何在 webapp 的每个页面上阅读它?

我认为我可以使用 JavaScript 设置 cookie,然后通过自定义过滤器读取它(它将从请求中读取 cookie,将其设置为属性并将其发送到控制器。

这个想法正确吗?或者我应该将 cookie 设置在其他地方(如果是,在哪里以及为什么?)

更新 1:

我想要实现的目标:我在登录页面上有下拉框(语言选择器),其中包含一些值(语言代码,例如“en”),并且需要将所选值设置为 cookie(例如“lang” ) 并且该“lang” cookie 将在稍后的页面上为 i18n 显示为红色。我已经让 i18n 工作了,但我需要阅读“lang”cookie 来设置所选语言。

更新 2:

我做了我想做的事,但并不完全干净:

我正在通过 Javascript 设置 cookie,确切地说是 jQuery,当用户选择或更改 <select/> 中的选择时,Javascript 会将语言值作为 cookie 注入(例如 en):

HTML:

<select name="language" id="selectLanguage" class="form-control">
   <option val="en">English</option>
</select>

JS:

var cookie = {

    set: function($this) {
        var now = new Date();
        var time = now.getTime();
        var expireTime = time + 1000*36000;
        now.setTime(expireTime);
        document.cookie = 'lang=' + $this.val() +';expires='+now.toGMTString()+';path=/';
    }

}

$('#selectLanguage').change(function(event) {
    cookie.set($(this));
});

然后我创建了新的 Filer,我称之为 CookieFilter.java

public class CookieFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;

        Cookie[] cookies = ((HttpServletRequest) req).getCookies();
        if (cookies != null) {
            for (Cookie ck : cookies) {
                if(ck.getName().toString().equals("lang")){
                    req.setAttribute("languageCookie", ck.getValue());
                } else {
                    req.setAttribute("languageCookie", "en");
                };
            }
            chain.doFilter(req, res);
        }
    }

    public void init(FilterConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }
    public void destroy() {
        // TODO Auto-generated method stub
    }
}

web.xml 中添加了新的 filter

<filter>
    <filter-name>CookieFilter</filter-name>
    <filter-class>
        package.path.to.CookieFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>CookieFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

为了完成这一切,我在控制器中收到了来自 CookieFilter 的请求,并将我发送的属性变为红色:

String cookie = request.getAttribute("languageCookie").toString();
model.addAttribute("languageCookie",cookie);

现在我可以从model 中读取属性并将其设置在 .JSP 中,或者用它做任何我想做的事情。

这是我的解决方案,但必须有其他方法...... :)

【问题讨论】:

  • Cookie 处理是 servlet API 的基本部分(通过 HttpServletRequest 上的 setCookiegetCookies 方法)。您确实需要解释您要实现的目标以及原因。
  • @LukeTaylor,我在登录页面上有下拉框(语言选择器),其中包含一些值(语言代码,例如“en”),并且选择的值需要设置为 cookie(例如 lang)和该 lang cookie 将在页面稍后显示为 i18n 的红色。我已经让 i18n 工作了,但我需要阅读 lang cookie 来设置所选语言。我知道它们是基本部分,但我不知道在哪里设置 cookie。在控制器中?在哪里? :D
  • 请将解决方案添加为答案而不是编辑。无论你喜欢与否,它都能解决你的问题。如果您想让 cmets 了解该代码有多好,您可能想在 CodeReview 上提出该问题

标签: java spring spring-mvc cookies spring-security


【解决方案1】:

那么,使用 cookie 是必需的还是您正在采用的方法?您可以使用拦截器在 Spring MVC 中非常干净地处理 i18n。我报道了here。基本上你需要注册一个拦截器并让它决定你的浏览器请求。

【讨论】:

  • 感谢您的回答。好吧,这只是我在这里的整个故事的方法,我会研究拦截器,但问题仍然是一样的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2015-09-29
  • 2012-07-05
  • 2018-01-22
  • 2011-01-08
  • 2012-01-19
相关资源
最近更新 更多