通过Spring MVC 的自定义拦截器实现灵活的登录拦截

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fullbug/article/details/53115458
SpringMVC 中的Interceptor 拦截器,它的主要作用是拦截用户的请求并进行相应的处理 。用户可以自定义拦截器来实现特定的功能,比如 通过它来进行权限验证,或者是来判断用户是否登陆等。
SpringMVC的拦截器提供了HandlerInterceptorAdapter抽象类,对应提供了三个preHandle,postHandle,afterCompletion方法。
preHandle在业务处理器处理请求之前被调用,
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,
afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。
所以要想实现自己的拦截管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
下面以一个例子来通过 SpringMVC 中的自定义Interceptor实现灵活的登录拦截,实现方式很简单。

1、新建一个CommInterceptor 继承 HandlerInterceptorAdapter 并重写其中三个方法。
public class CommInterceptor extends HandlerInterceptorAdapter{
	private final Logger log = LoggerFactory.getLogger(CommInterceptor.class);
	public String defultLogin="/account/login";//默认登录页面
	public Map<String,String> defineUrls;//自定义的Url,自定义拦截后的处理页面。
	
    @Override  
    public boolean preHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler) throws Exception {  

        //从session获取登录信息
  		if(SessionUtils.getAttribute(request, "user")!=null)
  		{
  			return true;
  		}
  		else
  		{
  			if(defineUrls!=null&&defineUrls.size()>0)
  			{
  				if(defineUrls.containsKey(url))
  				{
  					defultLogin=defineUrls.get(url).toString();
  				}
  			}
  			log.info("Interceptor:跳转到login页面!"+defultLogin+"-----");
   			response.sendRedirect(request.getContextPath()+defultLogin);
  			return false;
  		} 
    }  
  
    @Override  
    public void postHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler,  
            ModelAndView modelAndView) throws Exception {   
    }  
  
    @Override  
    public void afterCompletion(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex)  
            throws Exception {  
    }  
    
	public String getDefultLogin() {
		return defultLogin;
	}

	public void setDefultLogin(String defultLogin) {
		this.defultLogin = defultLogin;
	}

	public Map<String, String> getDefineUrls() {
		return defineUrls;
	}

	public void setDefineUrls(Map<String, String> defineUrls) {
		this.defineUrls = defineUrls;
	}
}

2、在Spring 配置文件中配置自定义的拦截器。
<!--配置拦截器 -->
<mvc:interceptors>
	<mvc:interceptor>
		<!-- 
		/**的意思是所有文件夹及里面的子文件夹 
		/*是所有文件夹,不含子文件夹 
		/是web项目的根目录 
		-->
		<mvc:mapping path="/personCenter/*" />
		<mvc:mapping path="/web/exam/yuDingXinXi" />
		<mvc:mapping path="/web/preRegister/goYuYueDingDan" />
		<!-- 微信预约体检 -->
		<mvc:mapping path="/exam/yuDingXinXi" />
		<!-- 微信体质辨识 -->
		<mvc:mapping path="/healthJudge/healthJudge" />
		<bean class="com.transfar.webportal.chp.common.interceptor.CommInterceptor">
			<!--定义拦截后重定向到默认的登录处理页面 -->
			<property name="defultLogin" value="/account/login" />
			<!--定义拦截后重定向到其他登录处理页面 -->
			<property name="defineUrls">
				<map>
					<entry key="/exam/yuDingXinXi" value="/connect/wx/start" />
					<entry key="/healthJudge/healthJudge" value="/connect/wx/start" />
				</map>
			</property>
		</bean>
	</mvc:interceptor>
</mvc:interceptors>
这样就实现了灵活的登录拦截,并且能够根据不同的场景重新定向到不同的登录处理页面,我这里是拦截的需要登录的URL,如果是网站的走默认登录页面,微信的走微信认证登录的页面。

猜你喜欢

转载自blog.csdn.net/fullbug/article/details/53115458