美文网首页
使用 @RequestAttribute,@SessionAtt

使用 @RequestAttribute,@SessionAtt

作者: 吉他手_c156 | 来源:发表于2020-11-20 17:19 被阅读0次

    我们一般前后端分离开发每次请求都会携带一些固定的参数,例如: 租户id,坐席 id,我们会将这些固定参数放在 header 中,这时我们就可以使用过滤器来拦截请求,然后将取到的参数可以放到 request 或者 session 作用域中,在 controller 中我们就可以使用 @RequestAttribute 或者 @SessionAttribute 注解来获取值

    过滤器

    @Component
    @WebFilter(urlPatterns={"/*"})
    @Slf4j
    public class ReqValFilter extends GenericFilterBean {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest)request;
            final String tenantId = req.getHeader("TENANT-ID");
            final String agentId = req.getHeader("AGENT-ID");
            log.debug("{}, {}", tenantId, agentId);
            req.setAttribute("agentId", agentId);
            req.getSession().setAttribute("tenantId", tenantId);
            chain.doFilter(request, response);
        }
    }
    

    controler 中获取值

    @GetMapping("/test")
    public Object test(@RequestAttribute String agentId,
                                 @SessionAttribute String tenantId){
          // TODO .....
    }
    

    @ModelAttribute 注解

    注解一个非请求处理方法
    被 @ModelAttribute 注解的方法将在每次调用该控制器类的请求处理方法前被调用。这种特性可以用来控制登录权限,当然控制登录权限的方法有很多,例如拦截器、过滤器等。
    使用该特性控制登录权限,创建 BaseController,代码如下所示:

    public class BaseController {
        @ModelAttribute
        public void isLogin(HttpSession session) throws Exception {
            if (session.getAttribute("user") == null) {
                throw new Exception("没有权限");
            }
        }
    }
    

    创建 ModelAttributeController ,代码如下所示:

    @RequestMapping("/admin")
    public class ModelAttributeController {
        @RequestMapping("/add")
        public String add() {
            return "addSuccess";
        }
        @RequestMapping("/update")
        public String update() {
            return "updateSuccess";
        }
        @RequestMapping("/delete")
        public String delete() {
            return "deleteSuccess";
        }
    }
    

    在上述 ModelAttributeController 类中的 add、update、delete 请求处理方法执行时,首先执行父类 BaseController 中的 isLogin 方法判断登录权限

    用 @RequestAttribute 去请求数据

    @ModelAttribute
        void beforeMethod(HttpServletRequest request) {
            request.setAttribute("aaa", "bbb");
        }
        
    // 使用 @RequestAttribute 获取参数
        @RequestMapping(value="/test", method=RequestMethod.GET)
        public Object String custom(@RequestAttribute("aaa") String foo) {
            // TODO ......
            return ......
        }
    

    相关文章

      网友评论

          本文标题:使用 @RequestAttribute,@SessionAtt

          本文链接:https://www.haomeiwen.com/subject/vdadiktx.html