1.Filter与Inteceptor
建议参考文档:https://www.cnblogs.com/austinspark-jessylu/p/7453302.html
Filter 主要是实现拦截客户端到达servlet到页面请求,并且能够修改请求(HttpServletRequest)的头和数据。只用于对request,response进行修改,一次请求通过两次Filter,请求时一次,在拦截器之间进行处理,执行doFilter()之前的代码,返回时一次,执行doFilter()中的代码.
如果要自己实现一个自定义的Filter必须实现javax.servlet.Filter接口,接口中有三个方法:inti(),doFilter(),destory().
Filter结合Inteceptor的调用过程;
Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter
Interceptor
可以通过实现HandlerInterceptor接口以及继承HandlerInterceptorAdapter来实现自定义拦截器
自定义拦截器中主要有三个方法:
prehandle(): 在业务处理器处理请求之前被调用
postHandle():在业务处理器处理请求完成之后,生成视图之前执行
afterCompletion():在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
public class SecurityInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
private static final String LOGIN_URL = "../login.html";
private static final String TIP_URL="../denied.html";
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res,
Object handler) throws Exception {
HttpSession session = req.getSession(true);
// 从session 里面获取用户名的信息
Object obj = session.getAttribute("user_account");
// 判断如果没有取到用户信息,就跳转到登陆页面,提示用户进行登陆
if (obj == null || "".equals(obj.toString())) {
res.sendRedirect(LOGIN_URL);
return false;
}
User user=userService.getUserByUserAccount(obj.toString());
if(user.getRole()!=3){
res.sendRedirect(TIP_URL);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res,
Object arg2, ModelAndView arg3) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest req,
HttpServletResponse res, Object arg2, Exception arg3)
throws Exception {
}
}
非springboot项目下拦截器的配置
总结:
对于上述过滤器和拦截器的测试,可以得到如下结论:
(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前,具体的流程见下图;
(4)、两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的