拦截器(Interceptor)
什么是拦截器
拦截器是springMVC 中的功能(Interceptor)、和过滤器类似、但是过滤器是servlet中的功能过滤器(Filter)、拦截器主要拦截请求、做出对应的拦截、类似判断用户是否登录等…
1、快速入门
- 创建普通的web项目
- 导入依赖
- 编写Controller层
- 编写拦截器(Interceptor)实现(HandlerInterceptor)
- 配置拦截器(Interceptor)
1、创建一个普通的web项目
2、导入依赖
<dependencies>
<!-- 为了方便,直接引入webmvc包,将会全部导入spring依赖包 -->
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
3、编写Controller层
@Controller
public class a {
@RequestMapping("/a")
@ResponseBody
public void a(){
System.out.println("a");
}
@RequestMapping("/b")
@ResponseBody
public void b(){
System.out.println("b");
}
@RequestMapping("/c")
@ResponseBody
public void c(){
System.out.println("c");
}
}
4、编写拦截器(Interceptor)
public class MyInterceptor implements HandlerInterceptor {
@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("====== 结束 ======");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("====== 清理 ======");
}
}
5、配置拦截器(Interceptor)
<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<context:component-scan base-package="com.wei.controller"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/a"/><!-- 要拦截的请求 -->
<mvc:exclude-mapping path="/b"/><!-- 放行的请求 -->
<bean class="com.wei.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
6、测试结果
访问/a请求时执行的效果
====== 开始 ======
a
====== 结束 ======
====== 清理 ======
小结:
拦截器有两种实现方式
-
实现HandlerInterceptor接口、重写里面方法
-
继承HandlerInterceptorAdapter类、重写里面的方法
-
public class MyInterceptor1 extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("开始"); return true; } }
最后在spring的配置文件中配置拦截器。
2、登录案例
案例流程:访问/admin 如果登录就访问到后台、没有登录就登录。
-
导入依赖
-
编写controllerx
-
编写拦截器
-
配置拦截器
-
编写页面
<dependencies>
<!-- 为了方便,直接引入webmvc包,将会全部导入spring依赖包 -->
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
1、AdminController
@Controller
public class AdminController {
/**
* 登录
* @param name 用户名
* @param pwd 密码
* @param request
* @return
*/
@RequestMapping("/adminLogin")
public String login(@RequestParam("name")String name,
@RequestParam("pwd")String pwd,
HttpServletRequest request){
if ("admin".equals(name) && "123456".equals(pwd)) { // 如果正确
request.getSession().setAttribute("admin",name); // 将名字传入session
return "redirect:/admin"; //转发到admin.jsp页面
}
return "redirect:/login"; //错误就到登录页面
}
@RequestMapping("/admin")
public String admin(){
return "/admin"; //后台首页
}
@RequestMapping("/login")
public String login(){
return "login"; //登录页面
}
@RequestMapping("/")
public String index(){
return "index"; //前端首页
}
}
2、编写拦截器
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("====== 开始 ======");
String name = (String) request.getSession().getAttribute("admin"); //从session域中获取到用户数据
if (name == null) {
response.sendRedirect("/login"); // 重定向到登录页面
return false; // 拦截
}else {
return true;// 放行
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("====== 结束 ======");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("====== 清理 ======");
}
}
3、配置拦截器
<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<!-- 1、注解驱动 -->
<mvc:annotation-driven/>
<!-- 2、静态资源过滤 -->
<mvc:default-servlet-handler/>
<!-- 3、扫描包 -->
<context:component-scan base-package="com.wei.controller"/>
<!-- 4、视图接解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/admin/**"/> <!-- 要拦截的请求 -->
<mvc:exclude-mapping path="/adminLogin"/> <!-- 放行的请求 -->
<mvc:exclude-mapping path="/login"/> <!-- 放行的请求 -->
<bean class="com.wei.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
4、登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>登录</h1>
<form method="post" action="/adminLogin">
<input type="text" name="name"/>
<input type="pwd" name="pwd"/>
<input type="submit" value="确定">
</form>
</body>
</html>
5、后台页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>后台首页</h1>
</body>
</html>
6、前端首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>前端首页</h1>
</body>
</html>
小结:最运行的结果就是访问/admin、如果没有登录就去登录页面啊、如果登录成功就去后台页面、在次访问也是后台页面