(十五)、SpringMVC拦截器
1.拦截器概述
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能(屏蔽骂人)。
过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器
- servlet规范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器
- 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的
2.SpringMVC拦截器和Struts拦截器区别
- 从拦截级别上来说,SpringMVC是方法级别的拦截,而structs2是类级别的拦截
- 数据独立性: SpringMVC方法独立,独享request和respone
- 拦截机制: SpringMVC 用的是aop方式,Structs2 有自己的interoptor机制 所以structs2的配置文件要大于SpringMVC
3.自定义拦截器
想要自定义拦截器,必须实现 HandlerInterceptor 接口。
4.搭配环境(web springmvc applicationcontext)
spring-mvc.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/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 "> <!--四个--> <!-- 1.注解驱动 --> <mvc:annotation-driven/> <!-- 2.静态资源过滤器 --> <mvc:default-servlet-handler/> <!-- 3.扫描包 --> <context:component-scan base-package="com.jsxs.controller"/> <!-- 4.视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
applicationcontext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="classpath:springmvc-controller.xml"/> </beans>
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"> <!-- 1.配置前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationcontxt.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 2.配置过滤器--> <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>
5.进行测试搭配环境是否合格
package com.jsxs.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @RequestMapping("/a1") public String test(){ System.out.println("拦截器被执行!!!"); return "hello!!"; } }
6.开始编写拦截器类(继承HandlerInterceptor)
MyInterceptor.java
return true; 执行下一个拦截器,放行。 return false; 拦截不放行
package com.jsxs.config; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor implements HandlerInterceptor { // return true; 执行下一个拦截器,放行 // return false; 拦截不放行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("*******处理前*******"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("*******处理后*******"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("*******清理*******"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
7.在springmvc中配置拦截器信息
/ 代表只过滤当前一个请求, /** 包括这个请求下面的所有请求
<!-- 5.拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <!-- / 代表只过滤当前一个请求, /** 包括这个请求下面的所有请求 eg: /admin/** ====> admin下面的所有信息都会被请求 --> <mvc:mapping path="/**"/> <bean class="com.jsxs.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>
<?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/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 "> <!--四个--> <!-- 1.注解驱动 --> <mvc:annotation-driven/> <!-- 2.静态资源过滤器 --> <mvc:default-servlet-handler/> <!-- 3.扫描包 --> <context:component-scan base-package="com.jsxs.controller"/> <!-- 4.视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 5.拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <!-- / 代表只过滤当前一个请求, /** 包括这个请求下面的所有请求 eg: /admin/** ====> admin下面的所有信息都会被请求 --> <mvc:mapping path="/**"/> <bean class="com.jsxs.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>
8.进行操作
package com.jsxs.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @RequestMapping("/a1") public String test(){ System.out.println("拦截器被执行!!!"); return "hello!!"; } }
9.解析拦截器返回值true 和 false
(十六)、SpringMVC拦截器实操
我们的实验目的是:我们在index页面设置两个超链接。①一个是通过超链接直接连接到我们登入页面,②另外一个超链接是直接链接到我们的首页。(是通过连接到方法,然后方法进行转发的操作)。然后我们进行如下操作,假如说我们没有进行登入的话,点击超链接②,拦截器会进行拦截然后让他跳转到登入页面,假如说我们已经登入了一个账号,那么我们点击超链接②页面就会跳转到首页
1.创建业务视觉端
index.xml
布置两个超链接,这两个超链接我们分别跳转登入页面和首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <div style="text-align: center"> <a href="${pageContext.request.contextPath}/User/ln">点击进入登入页面</a> </div> <div style="font-family: 楷体"> <a href="${pageContext.request.contextPath}/User/main">点击进入首页</a> </div> </body> </html>
main.jsp
展示首页信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登入页面</title> </head> <body> <h1 style="text-align: center;color: burlywood">首页</h1> </body> </html>
login.jsp
登入信息,设置一个表单,表单提交的路径是首页路径。在WEB-INF下面的所有页面或则资源,只能通过controller,或则servlet进行访问
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登入页面</title> </head> <body> <%--在WEB-INF下面的所有页面或则资源,只能通过controller,或则servlet进行访问--%> <h1 style="text-align: center;color: red;font-family: 楷体">登入页面</h1> <form action="${pageContext.request.contextPath}/User/sd" method="get"> 用户名 : <input type="text" name="username"> 密码 : <input type="text" name="password"> <input type="submit" value="登入"> </form> </body> </html>
2.编写controller层的数据
登入页面路径是:/User/ln ; 首页路径是: /User/main ; 表单提交的路径是:/User/sd。在这里我们会进行表格的提交验证,并且利用session进行存值的操作;并且验证密码和账户是否正确,假如账户和密码正确那么我们就对其跳转到首页面,如果不正确我们让他继续转发到登入页面
package com.jsxs.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpSession; @Controller @RequestMapping("/User") public class LoginController { // 我们先返回页面 @RequestMapping("/ln") public String login(){ return "/login"; } @RequestMapping("/sd") public String login1(String username, String password, HttpSession session){ // 把用户存到session中 session.setAttribute("user",username); if ("admin".equals(username)&&"121788".equals(password)){ return "main"; } return "redirect:/User/ln"; } // 进入首页 @RequestMapping("/main") public String main(){ return "main"; } }