基于Springmvc的登录权限拦截器

来源:互联网 发布:矩阵的秩与迹有关系吗 编辑:程序博客网 时间:2024/06/11 05:39

1.什么是拦截器
拦截器是指通过统一拦截从浏览器发往服务端的请求来完成功能的增强。
使用场景:解决请求的共性问题(如:乱码问题,权限验证问题等)
2.拦截器的基本工作原理
springmvc可以通过配置过滤器来解决乱码问题
拦截器的工作原理和过滤器非常相似
3.实现拦截器
(1)编写拦截器类实现HandlerInterceptor接口
(2)将拦截器注册进Springmvc框架中
4.拦截器的方法介绍
(1)preHandle方法,在请求被处理之前进行调用(返回值:表示我们是否需要将当前的请求拦截下来,返回
false,请求被终止,返回true,将继续运行,object arg2 表示的是被拦截的请求的目标对象)
(2)postHandle方法,在请求被处理之后调用(可以通过ModelAndView参数来修改显示的视图,或修改发往
视图的方法)
(3)afterCompletion,在请求结束之后才进行调用(做资源的销毁)
5.拦截器的其他实现方式
(1)拦截器的类还可以通过实现WebRequestInterceptor接口来编写
(2)想springmvc框架注册的写法不变
(3)弊端:preHandle方法没有返回值,不能终止请求
6.拦截器和过滤器的区别:
(1)过滤器依赖于Servlet容器,基于回调函数,过滤的范围大
(2)拦截器依赖于框架容器,基于反射机制,只过滤请求
7.总结:
(1)拦截器可以处理Web应用中请求的一些通用性问题
(2)共性问题在拦截器中处理,可以减少重复代码,便于维护
下面,我们就写一段实现登陆权限拦截器的代码吧!
一·编写一个继承HandlerInterceptorAdapter的类

package com.xinrui.hospital.action.interceptor;import java.util.Set;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.collections.CollectionUtils;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import com.xinrui.hospital.bean.Admin;import com.xinrui.hospital.util.AdminUtil;/** *  * @ClassName: LoginInterceptor * @Description: 登陆拦截器 * @author 梁志成 * @date 2016年3月27日 下午4:51:53 * */public class LoginInterceptor extends HandlerInterceptorAdapter {    // 排除的路径    private Set<String> excludeUrl;    // 包含的路径    private Set<String> includeUrl;    @Override    public void postHandle(HttpServletRequest request,            HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {    }    @Override    public boolean preHandle(HttpServletRequest request,            HttpServletResponse response, Object handler) throws Exception {        boolean flag = false;        // 获取当前url        String url = request.getRequestURI().toString();        String loginUrl = request.getSession().getServletContext()                .getContextPath()                + "/";        // 以工程名加+"/"结尾的也是登陆请求        if (url.endsWith(loginUrl)) {            return true;        }        // 判断当前路径是否包含在拦截器中        flag = is_include(includeUrl, url);        // 包含在拦截器中,再判断是否属于被排除的系列        if (flag) {            flag = false;            flag = is_include(excludeUrl, url);        } else {            flag = true;        }        // 需要被拦截        if (!flag) {            // 判断当前用户是否存在            Admin admin = AdminUtil.getCurrentAdmin();            if (admin != null) {                flag = true;            } else {                response.sendRedirect("login.html");            }        }        return flag;    }    /**     * @Title: is_include     * @Description: 查询是否包含在拦截器中     * @param @param sets     * @param @param url     * @param @return     * @return boolean     */    private boolean is_include(Set<String> sets, String url) {        boolean is_include = false;        if (CollectionUtils.isNotEmpty(sets)) {            for (String s : sets) {                if (url.contains(s)) {                    is_include = true;                    break;                }            }        }        return is_include;    }    public Set<String> getExcludeUrl() {        return excludeUrl;    }    public void setExcludeUrl(Set<String> excludeUrl) {        this.excludeUrl = excludeUrl;    }    public Set<String> getIncludeUrl() {        return includeUrl;    }    public void setIncludeUrl(Set<String> includeUrl) {        this.includeUrl = includeUrl;    }}

二·在springmvc的配置文件中注册改拦截器

<mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/*" />            <bean class="com.xinrui.hospital.action.interceptor.LoginInterceptor">                <property name="excludeUrl">                    <!-- 登陆请求排除 -->                    <set>                        <value>/login.</value>                        <value>/loginOn.</value>                        <value>/captcha-image.</value>                    </set>                </property>                <property name="includeUrl">                    <set>                        <value>.jsp</value>                        <value>.do</value>                        <value>.html</value>                    </set>                </property>            </bean>        </mvc:interceptor>    </mvc:interceptors>

三·编写一个获取当前用户的工具类

package com.xinrui.hospital.util;import javax.servlet.http.HttpServletRequest;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.xinrui.hospital.bean.Admin;/** *  * @ClassName: AdminUtil * @Description: 获取当前登录用户 * @author 梁志成 * @date 2016年3月27日 下午6:49:46 * */public class AdminUtil {    public static Admin getCurrentAdmin() {        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder                .getRequestAttributes()).getRequest();        return (Admin) request.getSession().getAttribute(Constants.ADMIN);    }}

好了,这样就可以实现登录权限拦截了,是不是很方便快捷啊。

1 0
原创粉丝点击