众筹网_管理员登录检查

 

一、目标

保护部分资源,使得这部分资源在未登录的情况下无法被访问

二、思路

三、代码

1、新建拦截器类

com.crowd.mvc.interceptor.LoginInterceptor

public class LoginInterceptor extends HandlerInterceptorAdapter{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        
        // 1.从request域中获取session对象
        HttpSession session = request.getSession();
        
        // 2.尝试从session域中获取管理员对象(需要类型强转)
        Admin admin = (Admin)session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN);
        
        // 3.判断admin是否为null
        if(admin == null) {
            throw new AccessForbbidenException(CrowdConstant.MESSAGE_ACCESS_FORBIDDEN);
        }
        
        // 4.admin不为null,返回true放行
        return true;
    }
    
}

 这里LoginInterceptor继承了HandlerInterceptorAdapter,而不是实现接口,是因为我们只需要用到preHandle()方法,其他方法不需要全部实现,因此选择继承,重写父类preHandle()方法

  • HandlerInterceptor接口中的方法及含义:
  1. preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
    当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。
  2. postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
  3. afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
  • 关于继承和实现
  1. 一个类只能继承一个类,但是可以实现多个接口。
  2. 接口里面的方法都是抽象方法,必须要重写所有的方法。接口抽象的方法都要被重写,而继承的类不必这样。
  3. 接口主要是实现一种松耦合,便于以后的维护、升级,继承主要是提高代码的可重用性,很多东西都可以在父类中做好。

2、在spring-web-mvc.xml中注册拦截器

<!-- 注册拦截器类 -->
    <mvc:interceptors>
        <mvc:interceptor>

            <!-- mvc:mapping 配置要拦截的资源 -->
            <!-- /*对应一层路径,比如:/aaa -->
            <!-- /**对应多层路径,比如:/aaa/bbb 或/aaa/bbb/ccc -->
            <mvc:mapping path="/**" />

            <!-- mvc:exclude-mapping 配置不拦截的资源 -->
            <mvc:exclude-mapping path="/admin/to/login/page.html" /><!-- 前往登录页 -->
            <mvc:exclude-mapping path="/admin/do/login.html" /><!-- 登录 -->
            <mvc:exclude-mapping path="/admin/do/logout.html" /><!-- 登出 -->

            <!-- 配置拦截器类,将拦截器类加入ioc容器 -->
            <bean class="com.crowd.mvc.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
  • <mvc:mapping , <mvc:exclude-mapping  , <bean要按顺序写

3、新建自定义异常,并在异常处理类中配置基于注解的异常映射

//未登录无权限异常
        @ExceptionHandler(value = AccessForbbidenException.class)
        public ModelAndView ResolveAccessForbbidenException(AccessForbbidenExceptionexception, HttpServletRequest request,
                HttpServletResponse response) throws IOException {

            String viewName = "admin-login";
            //  //回到admin_login还要显示message
            
            return commonResolveException(exception, request, response, viewName);
        }

 

报错记录:

登录页面不管密码对不对一直404,反复报这个错

 

 

推测是登录检查拦截器把登录请求全部拦截了,

最终发现,在spring-web-mvc.xml配置文件里拦截器里配置的不拦截路径中,登录的请求路径和handler方法中不一致,导致登录全部被拦截了

 

posted on 2021-07-24 15:34  魔法师多尼se  阅读(142)  评论(0)    收藏  举报