一、实现拦截器
package com.bxp.controller.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class UserTokenInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前进行调用(Controller方法调用之前)
* @param request
* @param response
* @param handler
* @return 返回true才会继续向下执行,返回false取消当前请求
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器被调用");
// 在拦截器中如果判断条件全部满足,结果返回true没什么大问题,流程正常执行
// 但是如果判断条件不满足,返回false时,后续所有方法就都不会执行,
// 但我们在前端页面不能什么内容都不返回,要返回出问题的内容,这时候就需要借助
// response自身的响应方法,将内容响应给前端了
boolean condition = false;
if(condition){
return condition;
} else {
// 使用response将拦截的原因响应给前端
response.setContentType("text/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().print("这里表示请求被拦截,在这里可以返回任何内容,与正常响应一样");
}
return false;
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 在整个请求结束之后被调用,DispatcherServlet 渲染视图之后执行(进行资源清理工作)
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
preHandle: 在请求处理之前进行调用(Controller方法调用之前)
返回true才会继续向下执行,返回false取消当前请求
postHandle:请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
afterCompletion:在整个请求结束之后被调用,DispatcherServlet 渲染视图之后执行(进行资源清理工作)
在拦截器中如果判断条件全部满足,结果返回true没什么大问题,流程正常执行, 但是如果判断条件不满足,返回false时,后续所有方法就都不会执行, 但我们在前端页面不能什么内容都不返回,要返回出问题的内容,这时候就需要借助response自身的响应方法,将内容响应给前端了。
二、添加拦截器
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private UserTokenInterceptor userTokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 这里不使用IOC注入的,直接使用构造方法创建也行
registry.addInterceptor(userTokenInterceptor)
.addPathPatterns("/index/*").excludePathPatterns("/index/carousel");
super.addInterceptors(registry);
}
}
addPathPatterns方法添加要拦截的地址,*代表所有()
注意:* 和 ** 在使用时是不一样的,*是拦截一层子路径,**是拦截所有子路径,一直到最后一层
/wzxx/*可以拦截/wzxx/list,/wzxx/reply等访问路径,但是无法拦截/wzxx/list/,/wzxx/reply/,前后的路径只相差结尾的/,访问到的内容也完全一样,这种情况拦截器拦截效果很差,用户很容易越过拦截器访问,单个*的情况适合*后边还有其他子路径内容,例如/wzxx/*/item01,用*匹配一层路径的情况。
/wzxx/**可以拦截/wzxx/list,/wzxx/reply等访问路径,**代表拦截/wzxx开始的任意路径,不论后边有什么内容。
excludePathPatterns方法要排除那些地址,比如使用addPathPatterns("/index/*")拦截所有的index开头的地址,使用excludePathPatterns("/index/carousel")表示/index/carousel这个地址不在拦截方位内,排除拦截。