Java中过滤器与拦截器的使用

编程入门 行业动态 更新时间:2024-10-11 15:23:02

Java中<a href=https://www.elefans.com/category/jswz/34/1771166.html style=过滤器与拦截器的使用"/>

Java中过滤器与拦截器的使用

目录

Filter过滤器

Filter作用时机

Filter的使用

过滤器链

过滤器执行顺序

测试

Filter实现简单登陆验证

Interceptor拦截器

Interceptor的使用

Interceptor的拦截路径

Interceptor执行时机

Interceptor实现登录验证

Filter与Interceptor区别


Filter过滤器

Filter是JavaWeb三大组件(Servlet、Filter、Listener)之一。可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

Filter作用时机

Filter的使用

首先在自己的Filter类上添加@WebFilter注解

也需要在引导类上添加@ServletComponentScan注解(因为Filter不是SpringBoot的组件)

@WebFilter("/*")
public class DemoFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化方法,只会执行一次");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("所有的请求都需要执行一次该方法");//放行chain.doFilter(request,response);System.out.println("Controller执行完毕返回Filter");}@Overridepublic void destroy() {System.out.println("销毁方法,也只执行一次");}
}
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("login")public void login(){System.out.println("进行了登录验证");}
}

启动服务器,浏览器访问localhost:8080/user/login地址观察控制台输出

过滤器链

当一个Web服务存在多个过滤器时,会形成一个过滤器链

过滤器执行顺序

过滤器执行顺序根据字符串的自然排序来执行,即由A到Z的顺序。

测试

现在创建A、B两个过滤器

@WebFilter("/*")
public class AFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行A过滤器放行前方法");chain.doFilter(request, response);System.out.println("执行A过滤器放行后方法");}
}
@WebFilter("/*")
public class BFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行B过滤器放行前方法");chain.doFilter(request, response);System.out.println("执行B过滤器放行后方法");}
}

运行访问请求地址观察控制台输出 

Filter实现简单登陆验证

@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("login")public void login(HttpServletRequest request){request.getSession().setAttribute("token","ok");System.out.println("进行了登录验证");}@RequestMapping("/query")public void query(){System.out.println("查询成功");}
}
@WebFilter("/*")
public class DemoFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;String uri = req.getRequestURI();System.out.println(uri);//如果是登录请求则放行if (uri.contains("login")) {chain.doFilter(request, response);return;}Object token = req.getSession().getAttribute("token");if (token == null) {System.out.println("还没有进行登录");return;}if (token.equals("ok")) {//已经登陆成功 放行chain.doFilter(request, response);}}
}

先访问/user/query路径观察控制台输出

登陆后再次访问观察输出。

Interceptor拦截器

Interceptor是Spring提供的,用来动态拦截Controller的方法执行。

作用是拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

Interceptor的使用

在拦截器类上添加注解@Component并实现HandlerInterceptor接口。

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("目标资源方法执行前执行。放行返回true,不放行返回false");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("目标资源方法执行后执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("视图渲染完毕后执行");}
}

我们除了定义拦截器类之外,还需要将拦截器注册到Spring中。添加一个配置类

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册拦截器registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}

访问/user/query路径观察控制台输出

Interceptor的拦截路径

与过滤器有一个不同就是

  • /*:只能拦截一级路径意思是只能拦截/user而不能拦截/user/query
  • /**:拦截任意路径

在注册时除了可以配置拦截路径外还可以配置排除拦截路径

Interceptor执行时机

Interceptor实现登录验证

我们在配置里设置了排除对登录请求路径的拦截,那么在拦截器中只需要在执行Controller其他方法之前查询是否登录过即可

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String uri = request.getRequestURI();System.out.println(uri);Object token = request.getSession().getAttribute("token");if (token == null) {System.out.println("还没有进行登录");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("目标资源方法执行后执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("视图渲染完毕后执行");}
}

Filter与Interceptor区别

  • 过滤器需要实现的是FIlter接口,而拦截器需要实现HandlerInterceptor接口
  • 过滤器会拦截所有的请求路径。而拦截器只会拦截Spring中存在的请求路径

更多推荐

Java中过滤器与拦截器的使用

本文发布于:2023-12-06 21:23:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1668962.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:过滤器   拦截器   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!