众筹网_管理员登录检查
一、目标
保护部分资源,使得这部分资源在未登录的情况下无法被访问
二、思路
三、代码
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接口中的方法及含义:
- preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。 - postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
- afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
- 关于继承和实现
- 一个类只能继承一个类,但是可以实现多个接口。
- 接口里面的方法都是抽象方法,必须要重写所有的方法。接口抽象的方法都要被重写,而继承的类不必这样。
- 接口主要是实现一种松耦合,便于以后的维护、升级,继承主要是提高代码的可重用性,很多东西都可以在父类中做好。
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方法中不一致,导致登录全部被拦截了