目标
实现当用户访问公共资源时不进行拦截判断,访问受保护的资源时进行拦截判断是否登录,登录则放行、未登录则返回登录页面并提示
思路
创建拦截器类
注册拦截器,在注册拦截器中指定拦截哪一些请求
代码
因为我们拦截只需要在拦截前判断是否登录,所以我们就不自己实现拦截器接口了,因为自己实现需要覆盖重写好几个方法,很不方便。。所以我们选择继承HandlerInterceptorAdapter类,只覆盖重写preHandle方法即可
/**
* @author 14767
* 登录拦截器
* HandlerInterceptorAdapter 替我们实现了HandlerInterceptor接口
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 通过request对象获取session对象
HttpSession session = request.getSession();
// 尝试从session域中获取Admin对象
Admin admin = (Admin) session.getAttribute(CrowdConstant.ATTR_NAM_LOGIN_ADMIN);
// 判断admin对象是否为空
if (admin == null){
// 抛出异常
throw new AccessForbiddenException(CrowdConstant.MESSAGE_ACCESS_FORBIDDEN);
}
// 如果Admin对象不为空则返回true
return true;
}
}
然后配置mvc拦截器,因为要拦截的资源很多,不拦截的资源很少,所以我们拦截资源写/**,表示拦截任意资源
然后单独配置不拦截的资源,不拦截的资源有:发送登录请求、用户退出、登录的页面。这三个资源不予拦截,后面再根据需要添加需要不拦截的路径
<!-- 注册拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置要拦截的资源 /*对应的是一层路径比如/aaa /**对应多层路径比如/aaa/bbb -->
<mvc:mapping path="/**"/>
<!-- 配置我们不拦截的资源 -->
<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"/>
<!-- 配置拦截器类 -->
<bean class="com.hegong.crowd.mvc.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>