美文网首页程序员
过滤器(Filter)和拦截器(Interceptor)

过滤器(Filter)和拦截器(Interceptor)

作者: 凡哥爱丽姐 | 来源:发表于2021-01-12 22:42 被阅读0次

    过滤器(Filter)

        依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。包括:过滤低俗文字、危险字符等

    拦截器(Interceptor)

        依赖于web框架,依赖于SpringMVC(或Struts2)框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。同时一个拦截器实例在一个controller生命周期之内可以多次调用。

    拦截器与过滤器的区别

        1、拦截器是基于java的反射机制的,而过滤器是基本函数回调。
        2、拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
        3、拦截器只能对action请求起作用,过滤器可以对几乎所有的请求起作用。
        4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
        5、在action的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用过一次。

    拦截器例子

    整体架构
    项目架构
    1、pom.xml
    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.8</version>
        </dependency>
    
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.40</version>
        </dependency>
      </dependencies>
    
    2、web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
      <display-name>Archetype Created Web Application</display-name>
    
      <!--1.注册DispatcherServlet-->
      <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--启动级别-1-->
        <load-on-startup>1</load-on-startup>
      </servlet>
    
      <!--/ 匹配所有的请求;(不包括.jsp)-->
      <!--/* 匹配所有的请求;(包括.jsp)如果这里写/* 跳转jsp页面时就是在走一次DispatcherServlet,
                                      就会出现 success.jsp.jsp页面的错误情况-->
      <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
      <!--处理post乱码-->
      <filter>
        <filter-name>encoding</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>encoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>
    
    3、springmvc.xml配置文件
    <?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:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
                               http://www.springframework.org/schema/beans/spring-beans.xsd
                               http://www.springframework.org/schema/context
                               http://www.springframework.org/schema/context/spring-context.xsd
                               http://www.springframework.org/schema/mvc
                               http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com"></context:component-scan>
    
        <!--处理json乱码-->
        <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                        <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                            <property name="failOnEmptyBeans" value="false"/>
                        </bean>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
    
        <mvc:default-servlet-handler></mvc:default-servlet-handler>
    
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
    
        <!--关于拦截器的配置-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--/** 包括路径及其子路径-->
                <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
                <!--/admin/** 拦截的是/admin/下的所有-->
                <mvc:mapping path="/**"/>
                <!--bean配置的就是拦截器-->
                <bean class="com.fan.interceptor.loginInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    </beans>
    
    4、index.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <h2>Hello World!</h2>
    
    <p><a href="${pageContext.request.contextPath}/tologin">登录页面</a></p>
    
    <p><a href="${pageContext.request.contextPath}/index">主页</a></p>
    
    </body>
    </html>
    
    5、login.jsp
    <%--
      Created by IntelliJ IDEA.
      User: Mr Wei
      Date: 2021/1/12
      Time: 21:34
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"><br/>
        密码:<input type="text" name="password"><br/>
        <input type="submit">
    </form>
    </body>
    </html>
    
    6、loginsuccess.jsp
    <%--
      Created by IntelliJ IDEA.
      User: Mr Wei
      Date: 2021/1/12
      Time: 21:31
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>主页</h1>
    <h3>登录成功</h3>
    ${username}
    <p><a href="${pageContext.request.contextPath}/loginout">注销</a></p>
    </body>
    </html>
    
    7、拦截器
    package com.fan.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpSession;
    
    public class loginInterceptor implements HandlerInterceptor {
    
        //如果返回true执行下一个拦截器
        //如果返回false就不执行下一个拦截器
        public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
            System.out.println("------------处理前------------");
            // 如果是登陆页面则放行
            System.out.println("uri: " + request.getRequestURI());//得到请求路径
    
            if (request.getRequestURI().contains("login")) {//包含login的就放行
                return true;
            }
    
            HttpSession session = request.getSession();
    
            // 如果用户已登陆也放行
            if(session.getAttribute("username") != null) {
                return true;
            }
    
            // 用户没有登陆跳转到登陆页面
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return false;
        }
    
    
        public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
    
        public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    
    8、controller类
    package com.fan.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpSession;
    
    @Controller
    public class ControllerTest {
    
        @RequestMapping("/tologin")
        public String Tologin(){
            return "login";
        }
    
        @RequestMapping("/index")
        public String Tologinsuccess(){
            return "loginsuccess";
        }
    
    
        @RequestMapping("/login")
        public String login(String username, String password, HttpSession session){
            System.out.println(username+" "+password);
            session.setAttribute("username",username);
            return "loginsuccess";
        }
    
        @RequestMapping("/loginout")
        public String loginout(HttpSession session){
            session.removeAttribute("username");
            return "index";
        }
    }
    

    相关文章

      网友评论

        本文标题:过滤器(Filter)和拦截器(Interceptor)

        本文链接:https://www.haomeiwen.com/subject/bancvktx.html