Spring MVC 拦截器

来源:互联网 发布:机关游泳馆办卡通知 编辑:程序博客网 时间:2024/05/19 09:38

目的:对请求的通用处理,包括乱码和权限控制等


实现  通过在Spring中注入拦截器的类来实现


Spring 有自己的拦截器   也可以自定定义拦截器   自己定义的拦截器 需要实现handlerInterceptor 接口 

然后在Spring的配置文件中,对这个拦截器进行配置 

配置方式为 <mvc:interceptors>  
  中间加上类路径   <bean class="com.ai.aiga.view.interceptor.AuthInterceptor" />  
</mvc:interceptors>  

这样的话所有的请求都会先经过这个拦截器 在进入控制层


但是如果不想让所有的请求都经过 就需要配置拦截规则

<mvc:interceptors>  
  <mvc:interceptors>  

<mvc:mapping path = "需要拦截的路径"/><--! -这里就是规则->
     <bean class="com.ai.aiga.view.interceptor.AuthInterceptor" />  
</mvc:interceptors>  
</mvc:interceptors>



  

handlerInterceptor 有三个方法


分别为public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)


public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}

public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}


preHandle是在请求被处理之前调用   表示是否需要将当前的请求拦截下来 如果返回false请求将被终止 true请求继续,参数表里有个Object handler  这个 handler  就表示 被处理的目标 也就是Controller的那个目标对象 那个类

postHandle是在请求被处理之后调用

参数ModelAndView可以对模型和视图进行控制,可以通过ModelAndView.addObject("msg","返回到视图")  再在前台${msg} 来取到值


afterCompletion是在请求结束之后调用  视图已经显示出来之后 用于最一些资源、流的关闭和销毁



当有多个拦截器的时候  还没到达控制器的时候,是依次执行他们的preHandle方法 返回的时候也依次执行postHandle方法 结束的时候是依次执行afterCompletion方法





登陆页面和登陆处理url都要写在exclude-mapping path,不然登陆处理也会被拦截器拦截:
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/WEB-INF/jsps/login.jsp"/>
<mvc:exclude-mapping path="/user/dologin"/>
<bean class="com.my.interceptor.LoginInterceptor"></bean>




使用场景:1、处理请求当中的共性问题 比如乱码

2、权限问题 比如对用户是否登录进行判断 if(arg0.getSession.getAttribute("user")=null){

request.getRequestDispatcher("/login.jsp").forward(request, response)

return false;

}




和过滤器的比较


过滤器filter依赖于selvelt容器,基于回调方法,过滤范围大,还可以过去资源

拦截器interceptors依赖于框架容器,基于反射机制只过滤请求


0 0
原创粉丝点击