在spring构架的程序中,要优先使用拦截器。Filter(过滤器)只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。
拦截器和过滤器的区别
参见 https://blog.youkuaiyun.com/baidu_33497625/article/details/51729249
在SpringBoot中使用拦截器
参见 https://blog.youkuaiyun.com/w_x_z_/article/details/56681798
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebConfig extends WebMvcConfigurerAdapter
{
//把拦截器注入为bean
@Bean
public HandlerInterceptor getMyInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/goodscart/*");
super.addInterceptors(registry);
}
}
public class LoginInterceptor implements HandlerInterceptor
{
/**
* controller 执行之前调用
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String sessionId = request.getParameter("sessionId");
String userId = request.getParameter("userId");
// http请求地址
String path = "XXX";
String res = "";
try
{
//通过httpclient模拟POST请求,获取登录信息
JSONObject result = JSONObject.parseObject(res);
if(XXX)
{
return true;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
/**
* controller 执行之后,且页面渲染之前调用
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* 页面渲染之后调用,一般用于资源清理操作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}