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"/>
<!–配置拦截器类–>
<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>