zoukankan      html  css  js  c++  java
  • spring filter and interceptor

    Spring Filter  过滤器   和 Interceptor 拦截器

    环境 : maven 工程 , 已配好springmvc 的运行环境 

    一、Filter 的实现 

    1、自定义一个类 MyFilter , 实现Filter 接口 。

    package com.crystal.api.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    /**
     * Created by Administrator on 2017/4/28.
     */
    public class MyFilter implements Filter {
        
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
            System.out.println("init method");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            System.out.println("detail implement ...");
        }
    
        @Override
        public void destroy() {
    
        }
    }

    注 :Fliter是javax.servlet-api jar包中的Filter 。

      maven对应的jar包 :

      <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
            </dependency>

    2、将自定义的类配置到配置文件中 web.xml 

    <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd" >

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <display-name>Archetype Created Web Application</display-name>


    <!-- spring mvc dispatcher filter-->
    <servlet>
    <display-name>Spring Dispatcher Servlet</display-name>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/WEB-INF/spring/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!--encoding filter-->
    <filter>
    <display-name>CharacterEncodingFilter</display-name>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- define filter -->
    <filter>
    <filter-name>defineFilter</filter-name>
    <filter-class>com.crystal.api.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>defineFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>



    </web-app>

    3. 启动工程,查看自定义拦截器是否生效 。

    二 、spring 拦截器

    1、自定义拦截器 类 DefineHandlerInterceptor , 继承  HandlerInterceptorAdapter

    package com.crystal.api.interceptor;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Created by Administrator on 2017/4/28.
     */
    public class DefineHandlerInterceptor extends HandlerInterceptorAdapter {
    
    
        /**
         * 请求执行之前
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            System.out.println("请求执行之前");
            System.out.println("可以做一些打印头信息之类的log");
            return true;
        }
    
    
        /**
         * 请求执行之后
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("请求执行之后");
            System.out.println("可以修改返回的视图");
        }
    
    
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        }
    }

    注 : preHandle 方法在 请求进来时,执行业务流程之前执行 。 返回值为 true : 则继续执行业务逻辑  ;返回值为false :则           整个请求就结束了,不会在继续执行业务逻辑 。

    2、配置文件 applicationContext.xml   ,以下贴图只是针对拦截器的配置信息,其他的springmvc的配置,请另做配置 。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
               http://www.springframework.org/schema/mvc
               http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    
    
        <!-- Controller and interceptor mapping for API -->
        <mvc:interceptors>
            <!-- Internationalisation interceptor -->
            <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    
            <mvc:interceptor>
                <mvc:mapping path="/v2/**"/>
                <mvc:exclude-mapping path="/v2/api-docs/**"/>
                <ref bean="defineHandlerInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
        <bean id="defineHandlerInterceptor"
              class="com.crystal.api.interceptor.DefineHandlerInterceptor">
        </bean>
    
    
    </beans>

    注 :<mvc:interceptors> 标签是拦截器的标识 。 里面可以配置多个拦截器 。配置多个拦截器的顺序是从上往下执行。<具体的prehandle 和 posthandle 方法的执行顺序,你可以多配置几个拦截器执行看结果> 

         拦截器配置方式 :(1)、如上的国际化拦截器,直接bean的方式:代表拦截所有的请求

                                 (2)、<mvc:interceptor> 方法 , 用<mvc:mapping>标签配置你要拦截的url,可用正则表达式,  <mvc:exclude-mapping> 标签配置配置你要排除的某个url 。ref 指向这个拦截器具体的拦截逻辑<就是自定义的拦截器类>

    3、启动工程,访问某个你拦截的url

    过滤器和拦截器写的比较简单。待以后完善 。因为我也只是一个初级的程序员。哈哈哈哈

      

  • 相关阅读:
    Python一键安装缺失库
    Python画樱花树❀
    Python时间模块time
    Python的画五角星
    力扣225.用队列实现栈
    STL是个啥?
    如何使用递归遍历对象获得value值
    JS操作未跨域iframe里的DOM
    CSS3D效果
    前端轮播小结
  • 原文地址:https://www.cnblogs.com/jxwy/p/6780904.html
Copyright © 2011-2022 走看看