springboot 拦截器和过滤器学习

//
springboot2.x的自定义拦截器 和 servlet3.0的自定义过滤器

拦截器定义在interceptor包下。

定义一个WebConfig类,用于添加具体的自定义拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private SessionInterceptor sessionInterceptor;//自动注入要添加的自定义拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sessionInterceptor).addPathPatterns("/**");//拦截器的添加和作用的范围的设定
        //还可以通过添加.excludePathPatterns("")在拦截路径中剔除路径
        //先注册的拦截器先对资源进行拦截
    }
}
定义一个自定义拦截器,如SessionInterceptor:

实现HandlerInterceptor:

  • preHandle:调用controller前
  • postHandle:controller调用之后,视图渲染之前
  • afterCompletion:用于清理资源
@Service//让spring接管,使其能自动注入userMapper
public class SessionInterceptor implements HandlerInterceptor {

    @Autowired
    private UserMapper userMapper;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Cookie[] cookies = request.getCookies();
        if (cookies!=null&&cookies.length!=0)
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals("token")){
                    String token = cookie.getValue();
                    UserExample userExample = new UserExample();
                    userExample.createCriteria().andTokenEqualTo(token);
                    List<User> users = userMapper.selectByExample(userExample);
                    if(users.size()!=0){
                        request.getSession().setAttribute("user",users.get(0));//当访问首页时,把user放到session中
                    }
                    break;
                }
            }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
拦截器不生效问题

所有子路径下的所有资源写作:/*/**
拦截器和筛选器同时使用会互相干扰
@Configuration注解的添加

过滤器定义在filter包下。

filter优先级

值越小优先级越高。自定义的过滤器避免和默认已实现的filter的优先级一样。

定义一个自定义过滤器,如LoginFilter:
@WebFilter(urlPatterns="/*", filterName="loginFilter")
public class LoginFilter implements Filter{
	@Override
	public void init(FilterConfig filterConfig) throws ServletException{
	}
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException{
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		String name = request.getParameter("username");
		if("从数据库拿到的数据".equals(name)){
			filterChain.doFilter(servletRequest, servletResponse);//执行回调函数doFilter进行放行操作
		} else{
			response.sendRedirect("/error.html");//验证失败返回自定义错误页面
			return;
		}
	}
	@Override
	public void destory(){
	}
}
过滤器不生效问题

启动类要添加@ServletComponentScan进行扫描
和拦截器一起使用会有冲突

过滤器和拦截器不同点

过滤器只能在容器初始化时调用一次,拦截器可以多次被调用
两者执行顺序:过滤前 -> 拦截前 -> 执行 -> 拦截后 -> 过滤后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值