步骤:
1、编写拦截器类实现HandlerInterceptor接口
2、将编写的拦截器类注册到springmvc框架中
3、配置拦截器拦截规则
1、
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class MyHandleInterceptor extends HandlerInterceptorAdapter{
private long requestTime;
@Autowired
private PerformanceService ps;
/**
* 请求处理前拦截
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
requestTime = System.currentTimeMillis();//记录当前系统时间戳
return true;
}
/**
* 请求处理后页面渲染前拦截
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* 请求处理后页面渲染后拦截
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
PerformanceEntity performance = new PerformanceEntity();
//获得session传入的对象
PersonEntity person = (PersonEntity) request.getSession().getAttribute("person");
CompanyEntity company = (CompanyEntity)request.getSession().getAttribute("company");
ManagerEntity commonManager = (ManagerEntity)request.getSession().getAttribute("commonManager");
ManagerEntity superManager = (ManagerEntity)request.getSession().getAttribute("superManager");
//设置请求人
if(person!=null){
performance.setRequestname(person.getName()+"访问:"+request.getRequestURI());
}
if(company!=null){
performance.setRequestname(company.getName()+"访问:"+request.getRequestURI());
}
if(commonManager!=null){
performance.setRequestname(commonManager.getName()+"访问:"+request.getRequestURI());
}
if(superManager!=null){
performance.setRequestname(superManager.getName()+"访问:"+request.getRequestURI());
}
long responseTime = System.currentTimeMillis();//记录当前系统时间戳
long time = responseTime - requestTime;//获得响应时间
performance.setTime(String.valueOf(time));
//设置等级
if (time<3000) {//优
performance.setGrade("优");
}
if (time>=3000&&time<5000) {//良
performance.setGrade("良");
}
if (time>=5000&&time<10000) {//中
performance.setGrade("中");
}
if (time>10000) {//差
performance.setGrade("差");
}
ps.addPerformance(performance);
}
}
2、3、
spring mvc 的xml 文件中一定要有如下:
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
<!-- 配置自定义拦截器 -->
<mvc:interceptors>
<mvc: mapping path="/myviews.form"/> 拦截规则:拦截所有以myviews.form结尾的请求
<bean class="com.lovo.interceptor.MyHandleInterceptor"/>
</mvc:interceptors>
PreHandle方法: 请求被处理前调用,返回值表示是否需要将当前请求拦截下来,
返回fasle 请求将被终止,请求不户到达controller ,true则放行
方法中的参数:
HttpServletRequest: 存储了所有请求的内容
HttpServletResponse: 存储了所有响应的内容
Object: 表示被拦截的请求的目标对象,即对应的controller方法
PostHanle方法 : 请求被处理后调用
参数ModelAndView 参数可以改变,
modelAndView.addobject(“msg”,"传回的是被拦截器改变后的数据");
modelAndVies.setViewName("hello.jsp");//修改视图跳转到的目的地
aftercompletion 方法 : 请求结束后调用
在请求响应后即视图已经显示出现后调用,一般用于资源的销毁
当一个项目有多个拦截器时的流程原理:
其他实现方式: 实现WebRequestInterceptor 接口
实现WebRequestInterceptor接口与实现HandlerInterceptor 接口 不同之处: 每个方法的参数不一样,且WebRequestInterceptor 接口的PreHandle 方法不
能终止请求。原理一样。注册写法一样。
使用场景:
解决共性问题: 1、解决乱码问题: 在PreHanle 和 postHandle 中分别设置 request.setCharacterEncoding("utf-8") response.setCharacterEncoding("utf-8")
2、解决权限验证问题: 在preHandle 中对用户是否登录进行判断,用户保存在session 中时
if(request。getSession().getAttribute("user")==null){
request.getRequestDisPatcher("/login.jps").forword(request,response);
}eles{
return true;
}
拦截器和过滤器的区别:
filter 依赖于servlet 容器 ,基于回调函数,过滤范围大,还可以过滤资源等
Interceptor 依赖于框架容器,基于反射机制,之顾虑请求