【发布时间】: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 上的
setCookie和getCookies方法)。您确实需要解释您要实现的目标以及原因。 -
@LukeTaylor,我在登录页面上有下拉框(语言选择器),其中包含一些值(语言代码,例如“en”),并且选择的值需要设置为 cookie(例如 lang)和该 lang cookie 将在页面稍后显示为 i18n 的红色。我已经让 i18n 工作了,但我需要阅读 lang cookie 来设置所选语言。我知道它们是基本部分,但我不知道在哪里设置 cookie。在控制器中?在哪里? :D
-
请将解决方案添加为答案而不是编辑。无论你喜欢与否,它都能解决你的问题。如果您想让 cmets 了解该代码有多好,您可能想在 CodeReview 上提出该问题
标签: java spring spring-mvc cookies spring-security