springMVC拦截器功能简单案例

来源:互联网 发布:淘宝图片怎么拍 编辑:程序博客网 时间:2024/06/06 04:29

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();



0 0
原创粉丝点击