拦截器
一、概述
(一)定义
- 一种是通过实现 HandlerInterceptor接口或者继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
- 另一种是通过实现 WebRequestInterceptor接口或继承WebRequestInterceptor接口的实现类来定义。
(二)拦截器配置
<!-- 配置拦截器-->
<mvc:interceptors>
<!-- 使用Bean直接定义在下面的interceptor将拦截所有请求-->
<bean class="com.ssm.interceptor.UserInterceptor"/>
<!-- 拦截器1-->
<mvc:interceptor>
<!-- 拦截器作用路径-->
<mvc:mapping path="/**"/>
<!-- 不需要拦截器的路径-->
<mvc:exclude-mapping path=""/>
<!-- 对匹配路径才拦截-->
<bean class="com.ssm.interceptor.Interceptor1"/>
</mvc:interceptor>
<!-- 拦截器2-->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.ssm.interceptor.Interceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
二、拦截器执行流程
(一)单个拦截器流程
示例4-1
- 创建项目,导包。
- 配置前端过滤器
- 创建com.ssm.controller包,创建控制器类HelloController
package com.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("HELLO");
return "success";
}
}
- 创建interceptor包,创建UserInterceptor。
package com.ssm.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 UserInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2)throws Exception{
System.out.println("UserInterceptor...preHandle");
return true;
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception{
System.out.println("UserInterceptor...postHandle");
}
public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1,Object arg2,Exception arg3)throws Exception{
System.out.println("UserInterceptor...afterCompletion");
}
}
- 创建SpringMVC配置文件
<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!-- 指定需要扫描的包-->
<context:component-scan base-package="com.ssm.controller"/>
<!-- 定义视图解析器-->
<bean id="viewResoler" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前提-->
<property name="prefix" value="/jsp/"/>
<!-- 设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置拦截器-->
<mvc:interceptors>
<!-- 使用Bean直接定义在下面的interceptor将拦截所有请求-->
<bean class="com.ssm.interceptor.UserInterceptor"/>
</mvc:interceptors>
</beans>
- 创建jsp文件夹,建立success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
成功!
</body>
</html>
- 启动项目
(二)多个拦截器执行流程
示例4-2
- 创建两个拦截器类Interceptor1和Interceptor2
package com.ssm.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 Interceptor1 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)throws Exception{
System.out.println("UserInterceptor1...preHandle");
return true;
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception{
System.out.println("UserInterceptor1...postHandle");
}
public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1,Object arg2,Exception arg3)throws Exception{
System.out.println("UserInterceptor1...afterCompletion");
}
}
package com.ssm.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 Interceptor2 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2)throws Exception{
System.out.println("UserInterceptor2...preHandle");
return true;
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception{
System.out.println("UserInterceptor2...postHandle");
}
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception{
System.out.println("UserInterceptor2...afterCompletion");
}
}
- 在SpringMVC配置文件中配置两个拦截器
<!-- 拦截器1-->
<mvc:interceptor>
<!-- 拦截器作用路径-->
<mvc:mapping path="/**"/>
<!-- 对匹配路径才拦截-->
<bean class="com.ssm.interceptor.Interceptor1"/>
</mvc:interceptor>
<!-- 拦截器2-->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.ssm.interceptor.Interceptor2"/>
</mvc:interceptor>
- 启动项目
(三)案例——用户登录权限验证
1、创建po包,User类
package com.ssm.po;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、创建UserController
package com.ssm.controller;
import com.ssm.po.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpSession;
@Controller
public class UserController {
@RequestMapping(value = "/toLogin",method = RequestMethod.GET)
public String toLogin(){
return "login";
}
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(User user, Model model, HttpSession session){
String username = user.getUsername();
String password = user.getPassword();
if (username!=null && username.equals("zhangsan")){
if (password!=null && password.equals("123456")){
session.setAttribute("user_session",user);
return "redirect:main";
}
}
model.addAttribute("msg","用户名或密码错误");
return "login";
}
@RequestMapping(value = "/main")
public String toMain(){
return "main";
}
@RequestMapping(value = "logout")
public String logout(HttpSession session){
session.invalidate();;
return "redirect:toLogin";
}
}
3.创建拦截器LoginInterceptor
package com.ssm.interceptor;
import com.ssm.po.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url=request.getRequestURI();
if(url.indexOf("/toLogin")>=0){
return true;
}
if (url.indexOf("/login")>=0){
return true;
}
HttpSession session=request.getSession();
User user= (User) session.getAttribute("user_session");
if(user!=null){
return true;
}
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/jsp/login.jsp").forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
4、配置拦截器
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.ssm.interceptor.LoginInterceptor"/>
</mvc:interceptor>
5.创建main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>管理主页</title>
</head>
<body>
当前用户信息:${user_session.username}
<a href="${pageContext.request.contextPath}/logout">退出</a>
</body>
</html>
6.创建login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
登录名:<input type="text" name="username" id="username"><br>
密码:<input type="password" name="password" id="password"><br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
7、启动项目