我们一般前后端分离开发每次请求都会携带一些固定的参数,例如: 租户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 ......
}
网友评论