您的位置:首页 > 编程语言 > Java开发

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

2017-10-06 11:37 381 查看
SpringMVC 中的Interceptor 拦截器,它的主要作用是拦截用户的请求并进行相应的处理。用户可以自定义拦截器来实现特定的功能,比如通过它来进行权限验证,或者是来判断用户是否登陆等。

SpringMVC的拦截器提供了HandlerInterceptorAdapter抽象类,对应提供了三个preHandle,postHandle,afterCompletion方法。

preHandle在业务处理器处理请求之前被调用,

postHandle在业务处理器处理请求执行完成后,生成视图之前执行,

afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。

所以要想实现自己的拦截管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。

下面以一个例子来通过SpringMVC 中的自定义Interceptor实现灵活的登录拦截,实现方式很简单。

1、新建一个CommInterceptor 继承 HandlerInterceptorAdapter 并重写其中三个方法。

[java]
view plain
copy

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 配置文件中配置自定义的拦截器。

[html]
view plain
copy

<!--配置拦截器 -->  

<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,如果是网站的走默认登录页面,微信的走微信认证登录的页面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐