springMVC中的拦截器
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理
用户可以自己定义一些拦截器来实现特定的功能。
谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺 序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。
拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的
它也是 AOP 思想的具体应用。
我们要想自定义拦截器, 要求必须实现:HandlerInterceptor 接口。
过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
一路下一步,一个 web工程的打包方式一定是 war
引入依赖 jar包
<groupId>club.adger</groupId>
<artifactId>myIntercepter</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 为了方便版本锁定 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
创建好,没有生成的目录
配置web.xml
<!--配置前端控制器-->
<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>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>
在 resources目录下建springmvc.xml,这里的名字 取接于你的 classpath:下的名字
建立springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="club.adger.controller"/>
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--前端控制器,哪些静态资源不拦截-->
<!--<mvc:resources location="//" mapping="/css/**"/>-->
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven />
</beans>
编写页面
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>拦截器</title>
</head>
<body>
<h2>
<a href="/user/testInterceptor">拦截器</a>
</h2>
</body>
</html>
在 WEB-INF里面 写一个 pages 根据你的跳转写
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>跳转成功</h2>
</body>
</html>
编写Controller
package club.adger.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/05/02/21:49
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testInterceptor")
public String testInterceptor(){
System.out.println("执行了");
return "index";
}
}
看下环境成功没
可以看见成功了
如果控制台乱码的话,加上这句话试试,或者看二图
-Dfile.encoding=UTF-8
我到就 解决了
写 拦截器了,配置拦截器
package club.adger.myintercepter;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/05/02/22:01
*/
public class MyInterCeptor implements HandlerInterceptor {
/**
* 预处理,Controllrer 方法执行之前就走他
* 如果 return true 就放行 反之 用 request 或者 response 跳转
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器执行了");
return false;
}
}
写好了,但是 springMVC怎么知道拦截谁呢,springmvc.xml编写
<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 要拦截的具体方法 这两个只要配一个就行了 /** 所有方法拦截-->
<mvc:mapping path="/user/**"/>
<!-- 不要拦截的方法 -->
<!--<mvc:exclude-mapping path="/static/**"></mvc:exclude-mapping>-->
<!-- 配置拦截器的对象 -->
<bean class="club.adger.myintercepter.MyInterCeptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
点击一下,可以看见被拦截了,一片空白
这个HandlerInterceptor有三个方法,比如没登陆就让他跳个界面嘛
request.getRequestDispatcher("/WEB-INF/error/error.jsp").forward(request,response);