本篇示例见这个项目的 mvc 分支下的 SesAndReqAttrController.java
① 使用@SessionAttribute来访问预先存在的全局会话属性
如果你需要访问预先存在的、以全局方式管理的会话属性的话,比如在控制器之外(比如通过过滤器)可能或不可能存在在一个方法参数上使用注解@SessionAttribute
:
/**
* 在处理请求 /helloWorld/jump 的时候,会在会话中添加一个 sessionStr 属性。
* <p/>
* 这里可以通过@SessionAttribute 获取到
*/
@RequestMapping("/sesAttr")
public String handleSessionAttr(@SessionAttribute(value = "sessionStr") String sessionStr, Model model)
{
System.out.println("--> sessionStr : " + sessionStr);
model.addAttribute("sth", sessionStr);
return "/examples/targets/test1";
}
为了使用这些需要添加或移除会话属性的情况,考虑注入org.springframework.web.context.request.WebRequest
或javax.servlet.http.HttpSession
到一个控制器方法中。
对于暂存在会话中的用作控制器工作流一部分的模型属性,要像“使用 @SessionAttributes 存储模型属性到请求共享的HTTP会话”一节中描述的那样使用SessionAttributes。
② 使用@RequestAttribute访问请求属性
就像@SessionAttribute
一样,注解@RequestAttribute
可以被用于访问由过滤器或拦截器创建的、预先存在的请求属性:
@RequestMapping("/reqAttr")
public String handle(@RequestAttribute("reqStr") String str, Model model)
{
System.out.println("--> reqStr : " + str);
model.addAttribute("sth", str);
return "/examples/targets/test1";
}
可以使用下面的过滤器进行测试:
@WebFilter(filterName = "myFilter", description = "测试过滤器", urlPatterns = { "/*" })
public class MyFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
System.out.println("--> MyFilter Do.");
request.setAttribute("reqStr", "万万没想到,啦啦啦啦啦!");
chain.doFilter(request, response);
}
@Override
public void destroy()
{}
}