zoukankan      html  css  js  c++  java
  • 通过Spring MVC 的自定义拦截器实现灵活的登录拦截

    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.xxx.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,如果是网站的走默认登录页面,微信的走微信认证登录的页面。
     
  • 相关阅读:
    org.apache.catalina.LifecycleException: Protocol handler start failed
    达梦数据库修改表失败 错误号: -6407 错误消息: 锁超时
    mybatis sql语句配置大于号小于号的处理(元素内容必须由格式正确的字符数据或标记组成)
    Unity基础—Transform类
    Naocs 配置中心报错问题
    inux 设置开机自启动 文件配置开机自启动命令
    jar中配置文件读取外面的配置文件
    Unity 制作天空盒
    Maven 剔除已存在jar包
    Maven安装本地jar包到本地仓库
  • 原文地址:https://www.cnblogs.com/xiejava/p/15171456.html
Copyright © 2011-2022 走看看