SpringMVC中拦截器的使用

SpringMVC中的拦截器(Interceptor)主要是拦截用户的请求并进行相应的处理。今天主要梳理的是权限的验证,判断用户的登陆状态,是否需要认证。


        张小心翼翼的图

   1、Interceptor的实现方法

   

   2、对于PreHandle这3个方法:

   


      好了,基础概念就介绍到这里,给大家推荐一个详细解读的博客.点我


      ♦今天的业务需求:

                                  

   代码实现:

       1、配置一个公开地址的配置文件

         


       

login.action=\u7528\u6237\u767b\u9646

       2、拦截器

          

public class LoginInterceptor implements HandlerInterceptor {

	//用于用户认证校验、用户权限校验
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		//得到请求的url
		String url = request.getRequestURI();
		//判断是否是公开 地址
		//实际开发中需要公开 地址配置在配置文件中
		//从配置中取逆名访问url
		List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");
		//遍历公开 地址,如果是公开 地址则放行
		for(String open_url:open_urls){
			if(url.indexOf(open_url)>=0){
				//如果是公开 地址则放行
				return true;
			}
		}
		
		
		//判断用户身份在session中是否存在
		HttpSession session = request.getSession();
		ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
		//如果用户身份在session中存在放行
		if(activeUser!=null){
			return true;
		}
		//执行到这里拦截,跳转到登陆页面,用户进行身份认证
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		//如果返回false表示拦截不继续执行handler,如果返回true表示放行
		return false;
	}
	
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("HandlerInterceptor1...postHandle");
		
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("HandlerInterceptor1...afterCompletion");
	}

}

      3、在配置文件中配置

         

 
 
<mvc:interceptors>  
    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  
    <bean class="com.host.app.web.interceptor.AllInterceptor"/>  
   		 <mvc:interceptor>  
       			 <mvc:mapping path="/test/number.do"/>  
      			  <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  
      			  <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  
   		 </mvc:interceptor>  
		<mvc:interceptor>
			<!-- 授权拦截 -->
			<mvc:mapping path="/**" />
			<bean class="cn.itcast.ssm.controller.interceptor.PermissionInterceptor"></bean>
		</mvc:interceptor>
</mvc:interceptors>  


 
 

  小结:

      有人问到过滤器和拦截器的区别,我也梳理一下,过滤器是依赖于servlet容器(struts),在实现上基于函数回调,可以对几乎所有的请求进行过滤。但缺点是一个过滤器实例只能在容器初始化时调用一次,来进行过滤操作,获得我们想要的数据。

     拦截器是依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于java的反射机制,属于面向切面编程(AOP)的一种应用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作。同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

     推荐博客。点我

 

猜你喜欢

转载自blog.csdn.net/binggetong/article/details/78831681