SpringMVC——拦截器Interceptor
简介
spring的拦截器interceptor就是web的Filter
部署
<!-- 配置拦截器群 -->
<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 配置拦截路径! /** 代表所有 --> <mvc:mapping path="/**"/> <!-- 配置排除操作 path=“排除路径” --> <mvc:exclude-mapping path="/user/login"/>
<!-- mvc内生成拦截器对象 --> <bean class="xyz.javaswing.Interceptor.PrivilegeInterceptor"/> </mvc:interceptor> </mvc:interceptors>
实现
拦截的使用实现Spring提供拦截器接口:HandlerInterceptor
重写内部的方法。
boolean preHandle (HttpServletRequest request , HttpServletResponse response , Object handler)
参数
request:拦截的请求对象
response:拦截的响应对象
handler:未知
返回值:boolean
返回值意义:能否通行。true可以通行,false不可通行
作用:拦截在响应前做出过滤操作
void postHandle(HttpServletRequest request,HttpServletResponse response , Object Handler,ModelAndView modelAndView)
参数:
request:拦截到的请求对象
response:拦截到的响应对象
handler:未知
modelAndView:拦截到的视图对象
返回值:无
返回值意义:无
作用:拦截请求,在视图返回前做出操作。
void afterCompletion(HttpServletRequest request,HttpServletResponse response , Object Handler,Exception ex)
参数:
request:拦截到的请求对象
response:拦截到的响应对象
handler:未知
ex:异常对象,未知作用
返回值:void
返回值意义:无
作用:在视图返回后,作操作
使用
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 配置排除操作 --> <mvc:exclude-mapping path="/user/login"/> <bean class="xyz.javaswing.Interceptor.PrivilegeInterceptor"/> </mvc:interceptor> </mvc:interceptors>
public class PrivilegeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 判断用户是否登陆,session中有无user HttpSession session = request.getSession(); User user =(User) session.getAttribute("user"); if( user == null ){ response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; // 不放行 } // 有user,放行。让它访问啥就访问啥。 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } }
拦截器的局限
spring mvc的拦截器只拦截controller不拦截jsp文件,如果不拦截jsp文件也会给系统带安全性问题。
解决方案有两种:
1、将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。
2、还有一种解决方案:jsp如果不放在WEB-INF文件下,spring mvc是无法拦截的,这种请情况下需要用最原始的servlet的Filter接口,具体可以参照