本篇示例见这个项目的 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.WebRequestjavax.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()
    {}
    
}

行一
51 声望35 粉丝

人不可能记住所有的细节