Java过滤器的使用和拦截排除的实现

本文介绍了Java Web开发中filter的基本概念及其实现方式,包括web.xml配置、filter的工作原理及其如何进行请求拦截与排除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java过滤器的使用和拦截排除的实现

本文将对如下几个内容作出讲解与说明:

  • web.xml的简单介绍

  • filter的工作原理

  • filter的实现

  • 拦截排除的实现和说明


web.xml简单介绍

在Java开发中,我们每天都有跟拦截器打交道,但是很多人对filter到底是个什么东西可能并没有做深入的了解,包括对web.xml中的servlet、servlet-Mapping、filter、filter-mapping都很陌生,那么现在我们可以简单的交流一下。

  • servlet
    <servlet>
        <servlet-name>A</servlet-name>
        <servlet-class>com.test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>A</servlet-name>
        <url-pattern>/a.do</url-pattern>
    </servlet-mapping>

servlet上表达的意思就是声明一个名字A的servlet,对应的实现类com.test.TestServlet。servlet-mapping表达的意思是,当一个请求后缀为a.do的http请求发送过来以后,该请求会调用名字为A的servlet,换句话说就是执行TestServlet来处理该请求。

  • filter
    有了上面servlet的理解,我们理解filter就更加方便。请看如下简单配置。
    <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>
            com.demo.test.util.SessionFilter
        </filter-class>
        <init-param>
            <param-name>excludedPages</param-name>
            <param-value>/index.jsp</param-value><!-- 匹配不做拦截的请求声明-->
        </init-param>
    </filter>
    <filter-mapping><!-- 拦截的请求类型-->
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>

上面的filter表达的意思是声明一个名字叫做SessionFilter的过滤器,该过滤器的具体实现对应com.demo.test.util.SessionFilter。该过滤器给定初始化参数(名称:excludedPages,参数:excludedPages),类似httpServletRequest对象中的声明的请求参数。filter-mapping表示当系统中发起有访问index.jsp的http请求的时候则调用该拦截器,也就是执行com.demo.test.util.SessionFilter。如果想要深入的了解filter工作原理,可以自己搜索资料,资料也很多。

filter具体class实现

public class SessionFilter implements Filter {

    private String excludedPages;

    private String[] excludedPageArray;

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        return;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        boolean isExcludedPage = false;
        for (String page : excludedPageArray) {
            if (((HttpServletRequest) request).getServletPath().equals(page)) {
                isExcludedPage = true;
                break;
            }
        }
        if (isExcludedPage) {
            chain.doFilter(request, response);
        } else {//
            HttpSession session = ((HttpServletRequest) request).getSession();
            if (session == null || session.getAttribute("") == null) {
                ((HttpServletResponse) response).sendRedirect("/login.htm");
            } else {
                chain.doFilter(request, response);
            }
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        excludedPages = fConfig.getInitParameter("excludedPages");
        if (null != excludedPages && excludedPages.length() > 0) {
            excludedPageArray = excludedPages.split(",");
        }
        return;
    }
}

当执行该拦截器会先执行init方法,我们在init方法中可以获取到在web.xml中配置给filter的初始化参数。在执行init方法执行,则执行dofilter方法,在该方法中我们实现过滤器的拦截作用,并实现拦截排除。

拦截器工作原理 如何实现拦截:
当一个http请求到达之后,并符合web.xml中的filter-mapping的映射规则,则触发执行filter,如果不做拦截,则调用chain.doFilter(request, response)让系统继续执行,如需要做拦截,则跳转到制定的页面,例上面的demo,则跳转到login.html页面。

排除拦截实现 如何对某个请求不做拦截:
当一个请求到达之后,我们在init中获取了web.xml中给filter配置的初始化参数,获取到该初始化数据就是我们不做拦截的请求的规则,本例子中是使用index.jsp作为拦截排除请求。也是使用index.jsp作为过滤器触发映射条件。也就是当系统中有http请求以index.jsp结尾,则该请求触发执行SessionFilter,在SessionFilter中我们获取到排除拦截的参数是index.jsp。在if (((HttpServletRequest) request).getServletPath().equals(page)) {代码中 就是处理当前的请求是否是请求index.jsp,如果是我们则不作拦截,如果不是我们则跳转到login.html页面。这样通过给filter制定初始化参数,并且在filter中将当前的request与初始化参数对比,来判断是否拦截本次请求的要求就达到了。
如果在阅读中遇到问题可以自己搜索资料了解web.xml在Javaweb项目中的作用于详细讲解。

<think>好的,我现在需要解释过滤器拦截器的注解实现方式。首先,我得回忆一下这两个概念在Java Web开发中的作用,通常是在Spring框架里提到的。过滤器属于Servlet规范,而拦截器是Spring MVC的组件。用户问的是注解实现的方式,所以重点应该放在如何通过注解来配置它们,而不是传统的XML配置。 首先,过滤器的注解实现。我记得在Servlet 3.0之后,可以使用@WebFilter注解。那需要确认一下具体步骤:创建一个类实现Filter接口,然后用@WebFilter注解标记,指定urlPatterns或者value属性来定义过滤的URL。可能还需要配置@Order或者通过其他方式指定过滤器的顺序,但注解本身是否支持顺序可能需要查阅,或者需要配合FilterRegistrationBean在配置类中设置。 然后是拦截器的注解实现。Spring中的拦截器通常是通过实现HandlerInterceptor接口,然后在配置类中通过@Configuration继承WebMvcConfigurerAdapter(不过现在可能推荐实现WebMvcConfigurer接口),覆盖addInterceptors方法,使用registry.addInterceptor()来注册拦截器,并添加路径匹配。这里用户希望用注解方式,可能需要提到使用@Bean或者是否有其他注解方式。不过拦截器本身可能需要配合配置类,而不仅仅是注解在类上。此外,是否还有其他注解,比如自定义注解来标记需要拦截的方法或控制器? 还需要比较两者的区别,比如过滤器更底层,处理HTTP请求响应,而拦截器可以访问处理方法的上下文,比如Controller对象、模型数据等。执行顺序方面,过滤器拦截器之前执行。 是否需要举例说明?比如写一个简单的@WebFilter的例子,然后写一个拦截器的配置类例子。同时,要提到在Spring Boot中可能更常用配置类来注册拦截器,而过滤器可以用@WebFilter或者通过FilterRegistrationBean。 可能还需要注意,某些情况下,即使使用注解,也需要在启动类上添加@ServletComponentScan来扫描@WebFilter等注解,尤其是在Spring Boot应用中。而拦截器的注册可能不需要额外注解,但需要明确的配置类。 总结步骤的话,过滤器用@WebFilter注解并指定URL,拦截器通过配置类注册。要确保用户明白两者的不同实现方式,以及相关的配置步骤。同时,指出它们的执行顺序作用范围的不同,帮助用户理解何时使用哪种技术。</think>### 过滤器拦截器的注解实现方式分步解析 --- #### **一、过滤器(Filter)的注解实现** 过滤器基于Servlet规范,作用于Web层,可拦截所有请求(包括静态资源)。 **实现步骤:** 1. **定义过滤器类** ```java @WebFilter(urlPatterns = "/*") // 拦截所有请求 @Order(1) // 指定执行顺序(可选,值越小优先级越高) public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // 前置处理(如日志、编码设置) System.out.println("过滤器前置操作"); chain.doFilter(request, response); // 放行请求 // 后置处理(如响应内容修改) System.out.println("过滤器后置操作"); } } ``` 2. **启用注解扫描(Spring Boot中需添加)** ```java @SpringBootApplication @ServletComponentScan // 扫描@WebFilter、@WebServlet等注解 public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } ``` **关键点:** - 使用`@WebFilter`定义URL匹配规则。 - 通过`@Order`控制多个过滤器的执行顺序(需配合`FilterRegistrationBean`生效)。 --- #### **二、拦截器(Interceptor)的注解实现** 拦截器是Spring MVC组件,作用于控制器(Controller)层级,可获取方法上下文信息。 **实现步骤:** 1. **定义拦截器类** ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 控制器方法执行前调用 System.out.println("拦截器前置操作"); return true; // 返回false则中断请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 控制器方法执行后、视图渲染前调用 System.out.println("拦截器后置操作"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 整个请求完成后调用(资源清理) System.out.println("拦截器完成操作"); } } ``` 2. **注册拦截器(通过配置类)** ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/api/**") // 拦截路径 .excludePathPatterns("/api/public"); // 排除路径 } } ``` **关键点:** - 通过实现`WebMvcConfigurer`配置拦截器。 - 使用`addPathPatterns()``excludePathPatterns()`精确控制拦截范围。 --- #### **三、核心区别** | 特性 | 过滤器(Filter) | 拦截器(Interceptor) | |--------------------|------------------------------------------|--------------------------------------| | **作用范围** | Servlet容器级别,处理所有请求 | Spring MVC级别,仅拦截控制器方法 | | **依赖** | Servlet规范(无需Spring环境) | 依赖Spring框架 | | **获取上下文** | 无法直接获取Controller或方法信息 | 可通过`HandlerMethod`获取方法信息 | | **执行顺序** | 在拦截器之前执行 | 在过滤器之后执行 | | **异常处理** | 无法直接使用Spring的异常处理机制 | 可结合`@ControllerAdvice`统一处理 | --- #### **四、如何选择?** - **使用过滤器**:处理与业务无关的底层操作(如全局编码、安全过滤、日志记录)。 - **使用拦截器**:需要依赖Spring上下文或控制Controller方法时(如权限校验、参数预处理)。 通过注解配置可简化开发,但需注意组件加载顺序及作用范围!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值