SpringMVC拦截器及拦截器栈

1、环境搭建所需包:
在这里插入图片描述

自定义拦截器简介:
拦截器与过滤器相似的技术,但是又存在区别,例如拦截器与Filter的比较:
springMVC拦截器值拦截Controller控制器;
Filter可以拦截所有的请求。

拦截器是拦截器请求,在控制器的前后添加功能,只是对控制的拦截;
与AOP的区别,AOP是对方法针对某一方法的前后进行扩展。

2、web.xml–前端控制器与字符过滤器配置
此处要注意的是字符编码过滤器配置URL路径一定要是 /*,
/ 与 / 的区别介绍: /*表示的是所有的请求都被拦截过滤,/表示的是除了.jsp请求之外的所有请求。

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <!--前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.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>

    <!--字符过滤器-->
    <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中拦截器及拦截器栈的配置介绍
3.1、拦截器的两种配置方式:
3.1.1、特定请求拦截器配置:

这是拦截器的一种配置,使用mvc:mapping配置哪些请求可以使用拦截器,在特定路径配置是要使用转义符/,不能省略。

<mvc:interceptors>
        <!--<mvc:interceptor>
            <mvc:mapping path="/Demo"/>
            <bean class="interceptor.DemoInterceptor"></bean>
        </mvc:interceptor>
  </mvc:interceptors>

3.1.2、默认拦截器配置:
此种配置拦截器的方法默认所有的请求都经过拦截器,可以使用默认拦截器配置方法配置拦截器栈,详情见3.2。

<mvc:interceptors>
        <bean class="interceptor.DemoInterceptor"></bean>
    </mvc:interceptors>

3.2、拦截器栈配置及简介:
拦截器栈配置时在此处配置多个拦截器类,需要注意的是配置的顺序和执行顺序有关
:以控制为中心,控制器执行之前按照下列配置顺序执行拦截器方法,
控制器执行之后,按照栈的先进后出顺序执行拦截器方

 <mvc:interceptors>
 
        <bean class="interceptor.DemoInterceptor"></bean>
        <bean class="interceptor.Demo02Interceptor"></bean>
    </mvc:interceptors>

3.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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="Controller"></context:component-scan>
    <!--注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--静态变量请求放行
    此处location="/js/"配置本地路径要保证是真实存在的,不然配置会报错
    -->
    <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
    <mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
    <mvc:resources mapping="/images/**" location="/images/"></mvc:resources>

    <!--拦截器配置-->
    <mvc:interceptors>
        <!--这是拦截器的一种配置,使用<mvc:mapping>配置哪些请求可以使用拦截器-->
        <!--<mvc:interceptor>
            <mvc:mapping path="/Demo"/>
            &lt;!&ndash;配置拦截器类&ndash;&gt;
            <bean class="interceptor.DemoInterceptor"></bean>
        </mvc:interceptor>-->


        <!--另外一种配置拦截器的方法:所有请求都会经过拦截器(可以使用这种拦截器配置方法配置拦截器栈) -->
        <!--
        拦截器栈配置时在此处配置多个拦截器类,需要注意的是配置的顺序和执行顺序有关
        注:以控制为中心,控制器执行之前按照下列配置顺序执行拦截器方法,
        控制器执行之后,按照栈的先进后出顺序执行拦截器方法
        -->
        <bean class="interceptor.DemoInterceptor"></bean>
        <bean class="interceptor.Demo02Interceptor"></bean>
    </mvc:interceptors>

</beans>

4、控制器类:

package Controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DemoController {
    @RequestMapping("Demo")
    public String Demo(String name, Model model){
        model.addAttribute("result",name);
        System.out.println("Demo ---> "+name);
        return "main.jsp";
    }
}

5、拦截器类:
5.1、DemoInterceptor.java

实现HandlerInterceptor,实现改接口中的方法preHandle()、postHandle()、afterCompletion()。

package interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DemoInterceptor implements HandlerInterceptor {
    /**
     * 在进入控制器之前进入此方法
     * 该方法有一个boolean类型的返回值,如果返回值为true,请求进入控制器,返回值为false,请求结束,不会再往下执行;
     * 实例:可以在此方法中对请求进行判断,例如登陆操作,是否已登录。
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("preHandle---> "+o.toString()+" --- 控制器对象");
        //httpServletResponse.sendRedirect("error.jsp");
        return true;
    }

    /**
     * 此方法是在控制器完成之后进入前端页面之前进入;
     * 可以在方法体中处理后台返回数据(例如:数据的敏感词汇过滤等)
     * 可以在此方法中进行日志记录
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle ---> "+o.toString()+" --- 控制器对象");
    }

    /**
     * 此方法是在进入前端页面之后进入,
     * 可以在此方法体将请求的结果记录到日志中
     * 不管请求是否异常都会进入,可以在日志中记录
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion ---> "+o.toString()+" --- 控制器对象");
    }
}

5.2、Demo02Interceptor.java

package interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo02Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("Demo02 的 preHandle ---> "+o.toString()+" --- 控制器对象");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        httpServletResponse.setCharacterEncoding("UTF-8");
        String model = (String) modelAndView.getModel().get("result");
        model = model.replace("对象","XX");  //敏感词汇
        modelAndView.getModel().put("result",model);
        System.out.println("Demo02 的 postHandle ---> "+o.toString()+" --- 控制器对象");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("Demo02 的 afterCompletion ---> "+o.toString()+" --- 控制器对象");
    }
}

6、前端页面
inde.jsp

<%@page pageEncoding="UTF-8" language="java" contentType="text/html; UTF-8" %>
<html>
<body>
<h2>Index.jsp -- Hello World!</h2>

<hr>

<form action="Demo" method="post">
    <input type="name" name="name"/>
    <input type="submit" name="提交" value="提交">
</form>

</body>
</html>

main.jsp:

<%--
  Created by IntelliJ IDEA.
  User: xingfuhu
  Date: 2020/5/29
  Time: 10:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Main</title>
</head>
<body>
<hr>
<h3>请求成功跳转页面!!!</h3>
<hr>
${result}
</body>
</html>

error.jsp:

<%--
  Created by IntelliJ IDEA.
  User: xingfuhu
  Date: 2020/5/29
  Time: 10:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Error</title>
</head>
<body>
<hr>
<h3>这是异常显示页面 --- 系统发生异常,请联系系统管理员处理!</h3>
<hr>

</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值