Interceptor(即处理器拦截器、拦截器),类似于 Servlet 开发中的过滤器 Filter,用于对处理器(Controller)进行预处理和后处理。
常见的应用场景:
1. 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面。
3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录)。
4.通用行为:读取 cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用。
举个例子验证用户是否处于登录状态:
springMVC.xml配置文件,添加拦截器功能
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/fileUploadController/fileUpload"/>
<!-- 自定义拦截器名称及类的映射路径-->
<bean id="LoginInterceptor" class="com.test.utils.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
jsp界面form表单提交:
<form method="post" action="findById">
<h3>登录</h3>
<label>用户名:</label><input type="text" name="username">
<br> <br>
<label>密 码:</label><input type="password" name="password">
<br><br> <br>
<div style="text-align: center">
<button type="submit">登录</button>
<button type="reset">重置</button>
<br>
<p><a href="register.jsp">还没有帐号?点击这里注册!</a></p>
</div>
</form>
对用后台controller接受参数,验证登录成功后通过session存储user(省略了service等代码):
@RequestMapping("/findById")
public String login (String username,Integer password,HttpSession session){
if(password == null || password.equals("")){
return "login";
}else{
Map<String,Object> map = userService.findByUserId(password);
if(map == null || map.isEmpty()){
return "login";
}
session.setAttribute("user", map);
// session.invalidate();
return "index";
}
}
当用户再次切换其它界面,就会用到拦截器判断,以下为拦截器代码实例:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter{
//进入Handler之前执行
//用于身份认证,身份授权
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Map map = (Map) request.getSession().getAttribute("user");
if(map == null || map.isEmpty()){
System.out.println("Interceptor:跳转到login页面!");
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
return false;
}else
return true;
}
//进入Handler之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
System.out.println("postHandle");
}
//Handler执行完成之后执行
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
最后补充一下session周期信息:
1.默认session周期为30min;
2.session周期设置两种方法如下:
2.1 session.setMaxInactiveInterval(你想设置的时间);设置的时间是以秒计算,它是根据服务器来计算时间.
2.2在web.xml配置文件里配置:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
上面20的意思是会话的失效时间是20分钟.这里是按照分钟来计算.
session销毁方法: session.invalidate();