SpringMVC拦截器的使用
一、什么是拦截器:
Java里的拦截器是动态拦截action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作
二、为什么要使用拦截器:
如果具有这样一个需求,就是用户未登陆的拦截等,我们可以使用springmvc的拦截器为我们做到。实现接口HandlerInterceptor接口,需要实现3个方法
三、需要实现的3个方法:
preHandler :控制器方法执行前调用, 是controller的前置方法,当方法返回false整个请求就结束了。多个Interceptor,然后 SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在。
postHandle : 执行控制器方法后,渲染视图之前调用。就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用。
afterHandler: 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,可用于清理资源。
四、代码如下:
1、com.ht.bean/User.java
package com.ht.bean;
/**
* Created by Administrator on 2019/3/1.
*/
public class User {
private int id;
private String uname;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、com.ht.controller/UserController.java
package com.ht.controller;
import com.ht.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
/**
* Created by Administrator on 2019/2/28.
*/
@Controller //表示这是一个控制层
@RequestMapping("/user") //全局的访问路径
public class UserController {
//该方法的访问路径为http://localhost:8080/SpringMVC_T03/user/login
@RequestMapping("login") //单个方法的访问路径
public String login(HttpSession session){
User user=new User();
user.setId(1000);
user.setUname("张三");
user.setPassword("111");
session.setAttribute("user",user);
return "hello";
}
@RequestMapping("/test")
public String test(){
System.out.println("连接一进来了");
return "hello";
}
}
3、com.ht.interceptors/LoginInterceptor.java
package com.ht.interceptors;
import com.ht.bean.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by Administrator on 2019/3/1.
*/
public class LoginInterceptor implements HandlerInterceptor{
//设置白名单URL //登录和注册的方法的url
private static final String[] IGNORE_URI ={"/user/login","/user/register"};
/*
* 控制器方法执行前调用
* */
@Override //1
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取当前访问路径
String url = request.getRequestURI();
System.out.println("访问路径 + url");
boolean flag = false;
//判断请求路径是否白名单中路径
for (String s : IGNORE_URI) {
if (url.contains(s)) {//如果访问路径是白名单
flag = true;
break;
}
}
if (!flag) {//不是在白名单的路径
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
System.out.println("还没有登录。。");
response.sendRedirect("/SpringMVC_T03/login.jsp");
return false; //表示不再往下执行
}
}
System.out.println("已经登录了");
return true;
}
/*
* 执行控制器方法后,渲染视图之前
* */
@Override //2
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 跳转的视图的名称:" +modelAndView.getViewName());
//System.out.println(modelAndView.getModelMap().get(""));
}
/*
* 方法执行完毕后(视图渲染后)
* */
@Override //3
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器结束");
}
}
4、config/spring-web.xml
<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、配置默认servlet处理器-->
<mvc:default-servlet-handler/>
<!--配置WEB-INF下面的资源可以访问-->
<!-- <mvc:resources mapping="/css/**" location="/WEB-INF/css/"></mvc:resources>-->
<!--<mvc:resources mapping="/js/**" location="/WEB-INF/js/"></mvc:resources>
-->
<!--3、视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4、扫描所有的控制器类-->
<context:component-scan base-package="com.ht.controller"/>
<!--配置拦截器
// /**表示拦截器所有的控制器请求 /user/** 拦截user下的所有请求
-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.ht.interceptors.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
5、WEB-INF/jsp/hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
BBBBB成功进入hello界面,你好
</body>
</html>
6、WEB-INF/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_3_1.xsd"
version="3.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:config/spring-web.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
7、index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="user/test">连接一</a>
</body>
</html>
8、login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是登录界面
<a href="user/login">登录</a>
</body>
</html>
注:操作说明:
先进入index.jsp,然后点击 “连接一” 这个超链接,由于配置了拦截器,所以会拦截未登录前的一切操作,会在控制台打印还未登录,直接跳转到登陆界面,然后点击登陆,登录之后就可以进入连接一了