这里以拦截器拦截登录为例,记录拦截器的使用方法
User类:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private Integer id;
private String name;
}
CommonResponseVo:
@Data
public class CommonResponseVo {
private String code;
private String msg;
private Object data;
}
UserController:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String checkLogin(@RequestParam("name") String name,@RequestParam("pwd")String pwd,HttpSession session){
CommonResponseVo responseVo = new CommonResponseVo();
if("admin".equals(name) && "123456".equals(pwd)){
responseVo.setCode("100");
responseVo.setMsg("登录成功!");
//这里设置session
session.setAttribute("loginUser","admin");
return JSON.toJSONString(responseVo);
}else{
responseVo.setCode("-100");
responseVo.setMsg("登录失败!");
return JSON.toJSONString(responseVo);
}
}
@GetMapping("/getUserInfo")
public String getUserInfo(){
User user = new User(2,"sojrs");
CommonResponseVo responseVo = new CommonResponseVo();
responseVo.setCode("100");
responseVo.setData(user);
return JSON.toJSONString(responseVo);
}
}
自定义拦截器类:
@Slf4j
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//验证session,如果未登录,则拦截该请求
if("admin".equals(request.getSession().getAttribute("loginUser"))){
return true;
}
log.info("拦截了{}方法",request.getRequestURI());
return false;
}
}
WebMvcConfigurer 的实现类:
如果要扩展springmvc的功能,官方建议写一个继承WebMvcConfigurer 的Mvc配置类,实现方法
@Configuration
public class JarvisMvcConfig implements WebMvcConfigurer {
/**
* 该方法用于添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截除/user/login方法外的所有请求
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login");
}
}
测试:
- 直接请求/user/getUserInfo
--- [nio-8080-exec-1] c.j.s.config.LoginHandlerInterceptor: 拦截了/user/getUserInfo方法
- 先请求:/user/login?name=admin&pwd=123456
前端返回:
{
code: "100",
msg: "登录成功!"
}
再请求/user/getUserInfo,前端返回,没有被拦截:
{
code: "100",
data: {
id: 2,
name: "sojrs"
}
}
方式2:
@Slf4j
@Component //这里需要加入到spring容器,在WebConfig中使用一个属性装配,并用addInterceptors添加拦截器
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Autowired
private RedisUtil redisUtil; //装配ioc容器中的bean
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...
return true;
}
}
@Configuration
public class MsgServerWebConfig implements WebMvcConfigurer {
@Autowired
private LoginHandlerInterceptor loginHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截除/user/login方法外的所有请求
//这里直接添加已经在ioc中的自定义拦截器loginHandlerInterceptor
registry.addInterceptor(loginHandlerInterceptor).addPathPatterns("/*/**").excludePathPatterns("/user/login");
}
}
方式3:
@Slf4j
public class HelloInteceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("request={}",request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion");
}
}
@Configuration
public class HelloMvcConfig implements WebMvcConfigurer {
@Autowired
private HelloInteceptor helloInteceptor;
@Bean
public HelloInteceptor helloInteceptor(){
return new HelloInteceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截除/user/login方法外的所有请求
registry.addInterceptor(helloInteceptor).addPathPatterns("/**");
}
}