基于SpringMVC的拦截器
SpringMVC的拦截器就像是我们以前在WEB项目里面写的filter过滤器,但是它又一样。
- 首先是以前的过滤器是需要我们手动过滤掉静态资源,但是SpringMVC里面的拦截器是可以自动过滤的
- 第二点就是拦截器需要注册在SpringMVC上面去
- 拦截器的效率更高代码更容易写。
- 拦截器的原理其实就是aop,它里面比较重要的三个方法,preHandle(req,resp,handler),postHandle,afterCompletion,都是横切过去的方法。我们可以通过preHandle来做主要拦截请求。
下面将会给出简单的案例一起学习(狂神的案例)。
说到拦截器,什么时候会需要使用拦截器呢?
我们登陆之前是不能够访问一些主页或者是个人页面的,那么这个时候是怎么做的呢?
没错我们以前可以使用过滤器,现在可以使用拦截器,来检测是否有用户已经登陆了。通常我们建立服务器与浏览器的会话,大部分时间都是可以使用session来进行对数据的存储,我们可以把用户的简要信息存储在session的键值对里面。
下面就是一个简单的登录验证的拦截器案例
先给出步骤
- 首先配置环境spring-mvc,注册映射器和适配器,过滤静态资源,视图解析器。别忘了在web.xml里面注册请求分发器和字符集处理器
- 创建前端页面,login页面,main页面,index页面
- 创建LoginController来接收处理请求,里面需要有跳转main页面,跳转login页面,login之后跳转main页面,注销方法(这里的注销会先跳到main页面并且把用户注销,第二次点击才会被拦截)。
- 创建LoginInterceptor,并且明确需要拦截什么样的请求。
可能遇到的问题
①前端组件的name没有写
②跳转的页面链接
③web项目没有导入jar包
④忘了注册拦截器
代码(spring-mvc)
<?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
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"/>
<!-- 过滤资源-->
<mvc:default-servlet-handler/>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--映射器和适配器和json的防止乱码-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 配置拦截器,跟过滤器相似,但是又不一样-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.kuang.interceptor.MyInterceptor" id="interceptor">
</bean>
</mvc:interceptor>
<!-- 登录拦截器-->
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean id="interceptor2" class="com.kuang.interceptor.LoginInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
代码(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_4_0.xsd"
version="4.0">
<!-- 请求分发器-->
<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:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 字符集乱码处理过滤器-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
代码(login.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login" method="get">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
代码(main.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<span>${sessionScope.userInfo}</span>
<p>
<a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>
</body>
</html>
代码(index.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<span>${sessionScope.userInfo}</span>
<p>
<a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>
</body>
</html>
代码(Controller)
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/user")
public class LoginController {
//跳转登录页面
@RequestMapping("/goLogin")
public String goLogin(){
return "login";
}
// 登录并且注册用户
@RequestMapping("/login")
public String login(HttpSession session,String username,String password){
session.setAttribute("userInfo",username);
System.out.println("登录成功");
return "main";
}
//跳转到主要页面
@RequestMapping("/main")
public String goMain(){
return "main";
}
//注销
@RequestMapping("/goOut")
public String goOut(HttpSession session){
session.removeAttribute("userInfo");
return "main";
}
}
代码(拦截器)
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 如果是登录可以过去
if(request.getRequestURI().contains("login")){
System.out.println("login开始处理");
return true;
}
// 如果是要去到登录页面也可以过去后端
if(request.getRequestURI().contains("goLogin")){
System.out.println("goLogin开始处理");
return true;
}
// 如果已经有登录信息就可以不拦截
if(request.getSession().getAttribute("userInfo")!=null){
System.out.println("我也开始处理了");
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
// 请求不通过,不能够访问后端服务器
return false;
}