springMVC拦截器功能简单案例

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值