创建BaseController 其他Controller继承它
1.在每次进controller时使用 @ModelAttribute 可以在controller之前执行方法
比如用户验证操作
/**
* 每次访问controller都执行
* @Title: show
* @param request
* @return void
* @throws
*/
@ModelAttribute
public void show(HttpServletRequest request, HttpServletResponse response,String jurisdiction) throws Exception {
if (jurisdiction != null && jurisdiction.equals("1")) {
} else {
// 获取Session对象
HttpSession session = request.getSession();
if (session.getAttribute("user") == null) {
response.sendRedirect("/");
return;
}
}
2.将前台传递过来的日期格式的字符串,自动转化为Date类型
@InitBinder 是该匹配Controller的请求执行映射的方法之前
webDataBinder是用于表单到方法的数据绑定的
/**
* 将前台传递过来的日期格式的字符串,自动转化为Date类型
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
// Date 类型转换
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(DateUtils.parseDate(text));
}
});
}
```
测试验证:
第一次验证
测试@ModelAttribute 全局运行
直接获取全局loginVo
/**
* 直接获取全局loginVo
*/
@PostMapping("login")
public ApiResponse login( LoginVo loginVo){
String token = yzUserService.login(loginVo.getUsername(),loginVo.getPassword());
return ApiResponse.success(token);
}
@ModelAttribute
/**
* 每次访问controller都执行
* 通过@RequestBody 从前端json获取loginVo 通过@ModelAttribute 返回成全局loginVo
* @return LoginVo
*/
@ModelAttribute
public LoginVo show(@RequestBody LoginVo loginVo) {
System.out.println(loginVo.toString());
return loginVo;
}
请求接口 返回token 正确
第一次测试结果:可以通过@ModelAttribute 获取全局数据 但是不提倡,有弊端
第二次验证:
验证@ModelAttribute(value="")时
需求: 当每次调用接口的时候都需要获取用户数据的时候,每个接口都写会产生冗余的代码,我们在每次请求之前在请求头中获取token获取用户数据,全局供给。
/**
* 根据token获取用户信息
* @Title: show
* @return void
* @throws
*/
@ModelAttribute("loginInfo")
public LoginInfoVo show(HttpServletRequest request) {
try {
String userId = JwtUtils.getUserIdByJwtToken(request);
LoginInfoVo loginInfoVo = yzUserService.getInfoById(userId);
return loginInfoVo;
}catch (BusinessException e){
e.printStackTrace();
throw new BusinessException(ErrorCodeEnum.USER_INFO_NOT_FOUND);
}
}
/**
* 获取全局用户信息
* @param loginInfo
* @return
*/
@GetMapping("auth/getLoginInfo")
public ApiResponse getLoginInfo(@ModelAttribute("loginInfo") LoginInfoVo loginInfo){
System.out.println("loginInfo"+loginInfo.toString());
return ApiResponse.success(loginInfo);
}
测试结果:
@ModelAttribute注释的value属性,来指定model 属性的名称。
可以根据需求,来确定是否要用用户数据