#spring# 写一个拦截器 当用户访问需要登录的页面的时候 判断是否登录

内容分享1周前发布
0 0 0

场景:
在java web项目中,会有这样的场景,有些页面需要用户登录才能访问 列如当你第一次打开某一个网站时 点击某个链接会跳出来登陆页面需要你先登录/注册。

第一需要一个拦截器.class:

public class LoginInterceptor extends HandlerInterceptorAdapter {
    @Autowired
    CategoryService categoryService;
    @Autowired
    OrderItemService orderItemService;

    /**
     这个方法很重大: preHandle
     * 在业务处理器处理请求之前被调用
     * 如果返回false
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
     * 如果返回true
     *    执行下一个拦截器,直到所有的拦截器都执行完毕
     *    再执行被拦截的Controller
     *    然后进入拦截器链,
     *    从最后一个拦截器往回执行所有的postHandle()
     *    接着再从最后一个拦截器往回执行所有的afterCompletion()
     */

    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        String contextPath=session.getServletContext().getContextPath();
//假设有以下两个页面需要登录才能访问
        String[] noNeedAuthPage = new String[]{
                "NeedLogin1",
                "NeedLogin2",
         };

        String uri = request.getRequestURI();
        uri = StringUtils.remove(uri, contextPath);
//由于我的项目里所有jsp文件都在fore文件夹下所以判断url时 确定以fore开头
        if(uri.startsWith("/fore")){
            String method = StringUtils.substringAfterLast(uri,"/fore" );
            if(Arrays.asList(noNeedAuthPage).contains(method)){
                User user =(User) session.getAttribute("user");
                if(null==user){
                    response.sendRedirect("loginPage");
                    return false;
                }
            }
        }

        return true;

    }

//以下两个方法时父类里带的 可以根据需要在里面加内容

    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
    /**
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
     * 可在modelAndView中加入数据,列如当前时间
     */

    }


    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    /**
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
     *
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
     */

    }

}

然后在spring.mvc中 加入配置:

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/fore*"/>
            <bean class="com.***.**.LoginInterceptor"/> //你创建的拦截器类的路径
        </mvc:interceptor>
    </mvc:interceptors>

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...