美文网首页
使用 @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