一、拦截器

  1.1拦截器简介

  Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求,  

  并进行一定的处理操作(如验证权限、记录日志、设置编码方式等)。

  1.2拦截器实现

  SpringMVC实现拦截器主要通过实现HandlerInterceptor接口,

  或者是继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来实现。

  HandlerInterceptor接口中有三个方法:

  public boolean preHanlder(){...}:该方法在执行控制类方法之前执行,

  如果该方法返回值为false后续执行终止(拦截器,处理器,控制类都终止)。

  public void postHandler(){...}:该方法在控制类中方法执之后执行。

  public void afterCompletion(){...}:该方法最后执行,在视图渲染结束后执行。

  

  例如用户发送一个请求执行控制类中某个方法,首先执行preHanlder方法。

  然后判断preHandler方法的返回值为true则继续执行,为false则中止。

  接着当控制类中方法执行完后,执行拦截器中的postHandler方法。

  接着执行后续的视图解析器,渲染视图,最后执行拦截器中的afterCompletion().

  

  1.3拦截器配置

  定义好拦截器类后,在xml文件中配置即可。

  配置元素:

  <mvc:interceptors>:所有拦截器都配置在该元素下。

  子元素为<mvc:interceptors>,一个子元素代表一个拦截器,

  可配置多个

  <mvc:interceptor>:配置单个拦截器

  <mvc:mapping>:指定拦截器需要拦截的路径。

  <mvc:exclude-mapping>:指定拦截器不需要拦截的路径。

    path属性作用于<mvc:mapping><mvc:exclude-mapping>,

    用于指定拦截路径。

  <bean>:代表具体拦截器的实现类。

    在<mvc:interceptors>中配置<bena>,则该拦截器为全局拦截器会拦截所有请求。

    在<mvc:interceptor>元素中配置,为拦截指定的路径。

  1. <!-- 配置拦截器 -->
  2. <mvc:interceptors>
  3. <!-- 配置在interceptors中为全局拦截器 -->
  4. <bean class = "com.springmvc.interceptor.CustomInterceptor"/>
  5. <!-- 单个拦截器 -->
  6. <mvc:interceptor>
  7. <!-- 配置拦截内容,拦截所有内容 -->
  8. <mvc:mapping path="/**"/>
  9. <!-- 配置不拦截内容 -->
  10. <mvc:exclude-mapping path=""/>
  11. <!-- 对应的拦截器 -->
  12. <bean class = "xxx.xxx.xxx"/>
  13. </mvc:interceptor>
  14. </mvc:interceptors>

  下面看一个拦截器的例子

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  6. version="3.1"
  7. metadata-complete="true">
  8. <display-name>SpringMVC</display-name>
  9.  
  10. <!-- 配置前端控制器 -->
  11. <servlet>
  12. <servlet-name>springmvc</servlet-name>
  13. <servlet-class >
  14. org.springframework.web.servlet.DispatcherServlet
  15. </servlet-class>
  16.  
  17. <!-- 初始化时加载配置文件,该配置文件是在src目录下创建的。 -->
  18. <!-- <init-param> 该选项不配置,则做会自动寻找WEB-INF下名为springmvc-servlet.xml的文件。-->
  19. <!-- <param-name>contextConfigLocation</param-name>-->
  20. <!-- <param-value>classpath:springmvc-config.xml</param-value>-->
  21. <!--</init-param>-->
  22. <!-- 当前servlet与容器一起加载 -->
  23. <load-on-startup>1</load-on-startup>
  24. </servlet>
  25. <!-- 所有请求都会被前端控制器拦截-->
  26. <servlet-mapping>
  27. <servlet-name>springmvc</servlet-name>
  28. <url-pattern>/</url-pattern>
  29. </servlet-mapping>
  30. </web-app>

CustomInterceptor.java(拦截器)

  1. import java.io.PrintStream;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5.  
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8.  
  9. public class CustomInterceptor implements HandlerInterceptor{
  10. //在HadlerAdapter之前执行(简单的看就是在访问控制类之前执行)
  11. PrintStream out = System.out;
  12. @Override
  13. public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
  14. // TODO Auto-generated method stub
  15. out.println("preHandle...");
  16. return true;
  17. }
  18.  
  19. //在控制器方法调用后,视图解析器之前执行。
  20. @Override
  21. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  22. throws Exception {
  23. // TODO Auto-generated method stub
  24. out.println("postHandle...");
  25. }
  26.  
  27. //最后执行,
  28. @Override
  29. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  30. throws Exception {
  31. out.println("afterCompletionHandle...");
  32. }
  33.  
  34. }

springmvc-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-4.3.xsd">
  14. <!-- 开启扫描 -->
  15. <context:component-scan base-package = "com.springmvc.*"></context:component-scan>
  16. <!-- testJson -->
  17. <!-- 配置注解驱动 -->
  18. <mvc:annotation-driven/>
  19. <!-- 指定某些文件不被前端控制器拦截,直接访问静态文件。 -->
  20. <!-- 设置视图处理器及其前缀后缀 -->
  21. <bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
  22. <property name="prefix" value = "/WEB-INF/jsp/"></property>
  23. <property name="suffix" value = ".jsp"></property>
  24. </bean>
  25.  
  26. <!-- 配置拦截器 -->
  27. <mvc:interceptors>
  28. <!-- 配置在interceptors中为全局拦截器 -->
  29. <bean class = "com.springmvc.interceptor.CustomInterceptor"/>
  30. </mvc:interceptors>
  31.  
  32. </beans>

控制类

  1. import org.springframework.stereotype.Controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3.  
  4. @Controller
  5. public class InterceptorsControl {
  6. @RequestMapping("/testInterceptor")
  7. public String handler() {
  8. System.out.println("handler");
  9. return "success";
  10. }
  11. }

success.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="com.springmvc.binderList.*" %>
  4. <!DOCTYPE html>
  5.  
  6. <html>
  7. <head>
  8. <meta charset="UTF-8">
  9. <title>Insert title here</title>
  10. </head>
  11. <body>
  12. success <br/>
  13.  
  14. </body>
  15. </html>

  1.4多个过滤器

  多个过滤器配置与上述类似,只是在<mvc:interceptors>中配置多个<mvc:interceptor>即可。

  关键是多个过滤器的执行顺序。

  

  假设有拦截器1~n,

  执行顺序为: pre(1) pre(2)....pre(n)   post(n) post(n-1)....post(1)   after(n)after(n-1)...after(1)

  

  先将上述CustomInterceptor中的所有打印语句中添加一个数字1。

  System.out.println("perHadler1")

  

  在将Customlnterceptor.java文件复制,并改名为CustomInterceptor2.java

  并将其中数字1改为2.

  

  修改springmvc-servlet.xml 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-4.3.xsd">
  14. <!-- 开启扫描 -->
  15. <context:component-scan base-package = "com.springmvc.*"></context:component-scan>
  16. <!-- testJson -->
  17. <!-- 配置注解驱动 -->
  18. <mvc:annotation-driven/>
  19.  
  20. <bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
  21. <property name="prefix" value = "/WEB-INF/jsp/"></property>
  22. <property name="suffix" value = ".jsp"></property>
  23. </bean>
  24.  
  25. <!-- 配置拦截器 -->
  26. <mvc:interceptors>
  27. <!-- 拦截器1 -->
  28. <mvc:interceptor>
  29. <mvc:mapping path="/testInterceptor"/>
  30. <bean class = "com.springmvc.interceptor.CustomInterceptor"/>
  31. </mvc:interceptor>
  32. <!-- 拦截器2 -->
  33. <mvc:interceptor>
  34. <mvc:mapping path="/testInterceptor"/>
  35. <bean class = "com.springmvc.interceptor.CustomInterceptor2"/>
  36. </mvc:interceptor>
  37. </mvc:interceptors>
  38.  
  39. </beans>

二、拦截器登录注册案例

  

User.java(POJO类)

  1. public class User {
  2. private int id;
  3. private String userName;
  4. private String password;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11.  
  12. public String getUserName() {
  13. return userName;
  14. }
  15. public void setUserName(String userName) {
  16. this.userName = userName;
  17. }
  18. public String getPassword() {
  19. return password;
  20. }
  21. public void setPassword(String password) {
  22. this.password = password;
  23. }
  24. }

Validate.java(拦截器)

拦截所有请求进行判断,

如果是去往登录页面或是登录验证放行,

如果已登录放行,

其它则跳转到登录页面。

未登录情况下无法任何资源页面,只能访问登录页面

  1. import javax.servlet.http.HttpServletRequest;
  2. import javax.servlet.http.HttpServletResponse;
  3. import javax.servlet.http.HttpSession;
  4.  
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7.  
  8. public class Validate implements HandlerInterceptor{
  9.  
  10. @Override
  11. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
  12. throws Exception {
  13. // TODO Auto-generated method stub
  14.  
  15. }
  16.  
  17. @Override
  18. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
  19. throws Exception {
  20. // TODO Auto-generated method stub
  21.  
  22. }
  23.  
  24. @Override
  25. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  26. // TODO Auto-generated method stub
  27. System.out.println("into interceptor");
  28. String url = request.getRequestURI();
  29. HttpSession session = request.getSession();
  30. //去往登录页面放行 或者是登录验证放行
  31. if(url.indexOf("/login") > 0 || url.indexOf("/checkLogin") > 0)
  32. return true;
  33. //已登录放行
  34. if(session.getAttribute("user") != null)
  35. return true;
  36. //既不是去登录页面,同时未登录则跳转到登录页面,并提升未登录,请登录。
  37. request.setAttribute("msg", "未登录,请登录");
  38. request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
  39. return false;
  40. }
  41.  
  42. }

UserController.java(控制类)

  1. import javax.servlet.http.HttpSession;
  2.  
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6.  
  7. @Controller
  8. public class UserController {
  9. //登录验证
  10. @RequestMapping("/checkLogin")
  11. public String checkLogin(User user, Model model, HttpSession session) {
  12. String userName = user.getUserName();
  13. String password = user.getPassword();
  14. //模拟数据查询
  15. if(userName != null && password != null &&
  16. userName.equals("hcf") && password.equals("123456")) {
  17. //登录成功后设置session用于记录登录状态
  18. session.setAttribute("user", user);
  19. return "main";
  20. }
  21. model.addAttribute("msg", "用户名或密码错误或为空!");
  22. return "login";
  23. }
  24.  
  25. //跳转main
  26. @RequestMapping("/main")
  27. public String toMain() {
  28. return "main";
  29. }
  30.  
  31. //跳转登录页面
  32. @RequestMapping("/login")
  33. public String login() {
  34. return "login";
  35. }
  36.  
  37. //注销用户,即销毁session
  38. @RequestMapping("/loginOut")
  39. public String loginOut(HttpSession session) {
  40. session.invalidate();
  41. return "login";
  42. }
  43. }

login.jsp (登录页面)

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. ${msg}<br> <!--表达提交后进行登录验证-->
  11. <form action = "${pageContext.request.contextPath}/checkLogin" method = "post">
  12. 用户名:<input type = "text" name = "userName"/><br/> <!--name属性的值要和POJO类中属性名相同才可自动填充-->
  13. 密 码:<input type = "text" name = "password"/><br/>
  14. <input type = "submit" value = "登录"/>
  15. </form>
  16. </body>
  17. </html>

main.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10.  
  11. weclome:<br>
  12. ${sessionScope.user.userName}
  13. <a href = "${pageContext.request.contextPath}/loginOut">注销</a>
  14.  
  15. </body>
  16. </html>

用户请求访问main.jsp,会被拦截,判断是否登录。

如果登录则放行,执行控制类中的跳转主页方法。

如果未登录则设置msg值,并跳转登录页面。

用户访问登录页面直接放行。

登录页面提交表单后也会被拦截,拦截器判断为登录检查放行。

控制类中会对用户名及密码进行检查。

密码正确设置session保持登录状态,并跳转到main.jsp.

密码错误则设置msg值,并跳转到登录页面。

   

1.5(Spring MVC学习笔记) 拦截器(Interceptor)的更多相关文章

  1. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  2. Spring MVC 学习 之 - 拦截器

    public class GlobalInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletR ...

  3. Spring MVC中的拦截器Interceptor

    谈谈spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先设置数据以及统计方法的执行效率等等.今天就来详细的谈一下spring中的拦截器.spring中拦截器主 ...

  4. spring MVC 学习(四)---拦截器,视图解析器

    1.接口HandlerInterceptor 该接口包含3个方法,分别是preHandle,postHandle,afterCompletion,分别代表着执行前,执行后,执行完成要执行的方法,其中p ...

  5. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  6. Spring MVC 学习笔记1 - First Helloworld by Eclipse【& - java web 开发Tips集锦】

    Spring MVC 学习笔记1 - First Helloworld by Eclipse reference:http://www.gontu.org 1. 下载 Spring freamwork ...

  7. spring mvc中的拦截器小结 .

    在spring mvc中,拦截器其实比较简单了,下面简单小结并demo下. preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Control ...

  8. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  9. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

随机推荐

  1. Substrings Sort string 基本操作

    You are given nn strings. Each string consists of lowercase English letters. Rearrange (reorder) the ...

  2. jQuery操纵DOM

    一.基本操作 1.html() - 类似于原生DOM的innerHTML属性 *获取 - html(); *设置 - html("html代码"); 2.val() - 类似于原生 ...

  3. bzoj1574 [Usaco2009 Jan]地震损坏Damage

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1574 [题解] 贪心把report的点的旁边所有点破坏即可. # include <s ...

  4. 上传代码到github上

    初始化 git init 添加远程仓库 git remote add origin[仓库名] 仓库地址 添加文件 git add . 本地提交 git commit -m 'message' 拉去远程 ...

  5. python学习 - yield

    def myYield2(): for i in range(3): yield '2222 i am in myYield2', 'i = ', i def myYield(): for i in ...

  6. Linux下进程描述(1)—进程控制块【转】

    转自:http://www.cnblogs.com/33debug/p/6705391.html 进程概念介绍 进程是操作系统对运行程序的一种抽象. • 一个正在执行的程序: • 一个正在计算机上执行 ...

  7. I2C和SPI总线对比【转】

    转自:http://blog.csdn.net/skyflying2012/article/details/8237881/ 最近2周一直在调试IIC和SPI总线设备,这里记录一下2种总线,以备后忘. ...

  8. Chubby lock service for distributed system

    Chubby lock service在分布式系统中的应用 Chubby lock service在分布式系统中提供粗粒度的锁服务, 以及可靠的存储. 相比高性能, 设计的重点在于高可靠性和高可用性. ...

  9. PL/SQL 05 存储过程 procedure

    --存储过程(不带参数) create or replace procedure 存储过程名as  变量.常量声明;begin  代码;end; --存储过程(带输入参数) create or rep ...

  10. 用js和jQuery做轮播图

    Javascript或jQuery做轮播图 css样式 <style> a{ text-decoration:none; } .naver{ width: 100%; position:r ...