拦截未经授权的访问
一、思路:
(1)将所有的jsp页面放在WEB-INF目录下,除了欢迎页面(或登录页面)
因为springmvc提供的拦截器只能拦截controller,不能拦截静态资源
(2)定义类实现HandlerInterceptor接口,创建拒绝未授权访问的视图error-403.jsp
(3)在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在
(4)对/user/login放行,对所有静态资源放行
二、定义LoginIntercepter类
LoginInterceptor 类
- 当没有获取到用户的session时,请求转发到错误提醒页面
public class LoginInterceptor implements HandlerInterceptor {
//验证登录信息
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器");
String loginName="";
//从session中获取name的值
Object attr=request.getSession().getAttribute("user");
if(attr!=null){
return true;
}else {
request.getRequestDispatcher("/WEB-INF/jsp/error-403.jsp").forward(request, response);
//request.setAttribute("msg", "您还没有登录,请先登录!");
//request.getRequestDispatcher("/login.jsp").forward(request, response);
}
return true;
}
}
三、springmvc配置
- 虽然拦截器本身并不拦截静态资源,但是我们在前面配置了springmvc提供的处理器对象来处理静态资源。所以拦截器也会拦截static中存放的所有静态资源,因此需要对这些静态资源放行。
- 对login处理器方法放行
<!--声明拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--指定拦截的请求的uri地址,可以使用通配符
**:表示任意的字符、文件或多级目录和目录中的文件-->
<mvc:mapping path="/**"/>
<!--放行login处理器方法以及静态资源-->
<mvc:exclude-mapping path="/user/login" />
<mvc:exclude-mapping path="/**/fonts/*"/>
<mvc:exclude-mapping path="/**/*.css"/>
<mvc:exclude-mapping path="/**/*.js"/>
<mvc:exclude-mapping path="/**/*.png"/>
<mvc:exclude-mapping path="/**/*.gif"/>
<mvc:exclude-mapping path="/**/*.jpg"/>
<mvc:exclude-mapping path="/**/*.jpeg"/>
<!--声明拦截器对象-->
<bean class="com.example.handler.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
四、效果
1、未登录时,在地址栏输入/user/index访问动态资源
2、拦截器拦截该请求,并跳转到登录异常页面