个人笔记之拦截器
SpringMVC中的拦截器是非常重要的,他用来拦截用户的请求并在作出相应处理后实现别的操作,例如登录验证,密码验证等等都用到它。
实现方式:
第一种:实现HandlerInterceptor接口
org.springframework.web.servlet.HandlerInterceptor
第二种:继承HandlerInterceptorAdapter适配器
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
1.拦截器的实现
1.1 实现 HandlerInterceptor 接⼝
首先在servlet-context.xml配置文件中配置拦截对象和放行对象:
<!-- 拦截器配置: (推荐使⽤,可以自己设置拦截和放行) -->
<mvc:interceptors>
<!--
定义在 mvc:interceptor 下⾯,可以⾃定义需要拦截的请求
如果有多个拦截器满⾜拦截处理的要求,则依据配置的先后顺序来执⾏
-->
<mvc:interceptor>
<!-- 通过 mvc:mapping 配置需要拦截的资源。⽀持通配符。可配置多个。 -->
<mvc:mapping path="/**"/> <!-- "/**"表示拦截所有的请求。 -->
<!-- 通过 mvc:mapping 配置不需要被拦截的资源。⽀持通配符。可配置多个。 -->
<mvc:exclude-mapping path="/url/*"/> <!-- "/url/*"表示放⾏url路径下的请求。 -->
<bean class="com.cl.ssm.interceptor.MyInterceptor01"/>
</mvc:interceptor>
</mvc:interceptors>
再来一个接口的实现类MyInterceptor01:
package com.cl.ssm.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//拦截器Try01,实现HandlerIntercept接口
public class MyInterceptor01 implements HandlerInterceptor {
/**
* 在 ⽬标Handler(⽅法)执⾏前 执⾏
* 如果返回 true:执⾏handler⽅法
* 若是返回 false:阻⽌⽬标handler⽅法执⾏
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
/**
* 在⽬标Handler(⽅法)执⾏后,视图⽣成 前 执⾏
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("⽬标Handler执⾏后,视图⽣成前执⾏MyInterceptor01 --> postHandle⽅法...");
}
/**
* 在⽬标Handler(⽅法)执⾏后,视图⽣成 后 执⾏
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("⽬标Handler执⾏后,视图⽣成后执⾏MyInterceptor01 --> afterCompletion⽅法...");
}
}
1.2 继承 HandlerInterceptorAdapter类
其实 HandlerInterceptorAdapter 类就是 HandlerInterceptor 接⼝的实现类:
我们来一个类MyInterceptor02来继承它,也就相当于变相实现了这个接口
package com.cl.ssm.interceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 拦截器实现
* 继承 HandlerInterceptorAdapter 适配器
*/
public class MyInterceptor02 extends HandlerInterceptorAdapter {
/**
* 在 ⽬标Handler(⽅法)执⾏前 执⾏
* 如果返回 true:执⾏handler⽅法
* 若是返回 false:阻⽌⽬标handler⽅法执⾏
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("⽬标Handler执⾏前执⾏MyInterceptor02 --> preHandle⽅法...");
return true;
}
/**
* 在⽬标Handler(⽅法)执⾏后,视图⽣成 前 执⾏
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("⽬标Handler执⾏后,视图⽣成前执⾏MyInterceptor02 --> postHandle⽅法...");
}
/**
* 在⽬标Handler(⽅法)执⾏后,视图⽣成 后 执⾏
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("⽬标Handler执⾏后,视图⽣成后执⾏MyInterceptor02 --> afterCompletion⽅法...");
}
}
对应的servlet-context.xml配置:
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的资源 -->
<mvc:mapping path="/**"/>
<!-- 放⾏的资源 -->
<mvc:exclude-mapping path="/url/test01"/>
<mvc:exclude-mapping path="/url/test02"/>
<bean class="com.xxxx.springmvc.interceptor.MyInterceptor02"/>
</mvc:interceptor>
</mvc:interceptors>
2.拦截器的应用(拦截非法请求)
将登录验证功能通过拦截器实现判断。
2.1 用户控制器
UserInfoController 定义
package com.cl.ssm.interceptor;
import com.cl.ssm.po.User;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ⾮法访问拦截
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
/**
* 在 ⽬标⽅法执⾏前 执⾏
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取 session 域对象中的user对象
User user= (User) request.getSession().getAttribute("user");
// 判断session域对象中的 user 是否为空
if(null == user){ // 如果为空,表示⽤户未登录
// 拦截⽤户跳转到登录⻚⾯
response.sendRedirect(request.getContextPath() + "/login.jsp");
// 不执⾏⽬标⽅法
return false;
}
// ⽤户已登录,执⾏⽬标⽅法
return true;
}
}
servlet-context.xml配置:
<!-- 拦截所有请求 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/**" />
<!-- 放⾏⽤户登录请求 -->
<mvc:exclude-mapping path="/userInfo/login"/>
<bean class="com.cl.ssm.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>