Spring-mvc拦截器
拦截器
在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览。对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求。在 Struts 2 框架中,拦截器是其重要的组成部分,Spring MVC 框架也提供了拦截器功能。
Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
拦截器的定义
在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,定义一个拦截器可以通过两种方式:一种是通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义
我们今天使用实现HandlerInterceptor接口的方式来实现我们的拦截器
步骤1
首先我们要创建一个空白的MAVEN工程 并加以web支持
步骤2
导入pom.xml所需要的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
步骤3
在Resources下创建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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解驱动 -->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置-->
<mvc:default-servlet-handler/>
<!-- 3.配置jsp 显示ViewResolver视图解析器 -->
<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>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.zhang.lan.Userinterceptors"></bean>
</mvc:interceptor>
</mvc:interceptors>
<context:component-scan base-package="com.zhang.controller" />
</beans>
细心的同学会发现这里的mvc多了一块
这里用来配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--拦截器实现类路径-->
<bean class="com.zhang.lan.Userinterceptors"></bean>
</mvc:interceptor>
</mvc:interceptors>
步骤3
(1)创建拦截器实现类Userinterceptors
(2)创建完成后实现HandlerInterceptor接口
用spring-mvc的最大特点就是它能将我们所需要的大部分业务已经完成好封装 我们只需按照它的方式来使用它即可
(3)实现HandlerInterceptor的方法 这里我们只需要实现preHandle方法即可
代码如下:
public class Userinterceptors implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果拦截返回false 如果成功返回true
//我们就可以通过一些条件判断来决定是否拦截网页
return false;
}
}
步骤4
(1)编写index.jsp页面
主显示页面
进入login进入登陆界面
进入tiao进入显示界面
当然如果没有输入正确的密码 我们就应当拦截该请求让他跳转到我们的登陆界面
<h1><a href="${pageContext.request.contextPath}/login">用户登陆</a></h1>
<a href="${pageContext.request.contextPath}/tiao">显示</a>
(2)创建登陆界面login.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/success" method="post">
<input type="text" name="name">
<input type="password" name="pass">
<input type="submit" value="提交">
</form>
</body>
</html>
数据提交后跳转到success方法处理
(3)如果成功跳转到显示页面show.jsp
<body>
欢迎您
</body>
步骤5
创建控制层(Controller类)
@org.springframework.stereotype.Controller
public class Controller {
@RequestMapping("/success")
public String login(String name, String pass, HttpSession session, Model model){
session.setAttribute("names",name);//将输入的name放入到session中 让拦截器判断是否为空值
System.out.println("name>=="+name);
model.addAttribute("msg",name);
return "show";
}
@RequestMapping("/tiao")
public String next()
{
return "show";
}
@RequestMapping("/login")
public String l(){
return "login";
}
}
步骤6
配置Tomcat运行测试
运行之后发现所以请求都被拦截
这时候我们就思考 什么时候拦截什么时候放行?
解决办法
(1)点击用户登陆 我们要跳转到登陆界面 所以请求应该被放行
(2)进入登陆界面后输入数据提交 判断登陆是否正确或者是否为空值
(3)登陆表单提交后 要交给后台来判断 放行登陆判断
既然想到了解决办法
那么我们就回到HandlerInterceptor实现类
HttpSession session=request.getSession();
//放行登陆界面 request.getRequestURI().contains("login")等于到当前路径下包含login的所有请求 为真放行
if (request.getRequestURI().contains("login")){
return true;
}
//放行提交表单后的判断
if (request.getRequestURI().contains("success")){
return true;
}
//判断session中的值是否为空值
if(session.getAttribute("names")!=null){
return true;
}
//没登陆或者登陆的值为空或者错误 重现重定向到登陆界面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
编写完成 继续测试
点击显示 请求被拦截 进入登陆界面
输入数据(这里只坐了一个是否为空的判断) 再登陆
登陆成功
在返回 直接点显示按钮 发现也能进入后台
那是因为session的值一直在服务器中保存 他始终为真
要想清除session的值 我们在退出的方法中加入
session.removeAttribute(“names”);
@RequestMapping("/tuichu")
public String tui(HttpSession session){
session.removeAttribute("names");
return "login";
}
返回登陆后只能重新登陆才能访问
总结
拦截器用于加密我们的项目系统 更加安全 拦截器拦截所有请求 每个方法执行前先调用拦截器 让拦截器来判断是否放行
关于拦截登陆问题
放行登陆界面
放行登陆后的后台处理
判断登陆是否正确或者是否为空值