JAVA Spring web mvc 学习 之 7:拦截器(登录状态验证)

来源:互联网 发布:澳大利亚留学费用知乎 编辑:程序博客网 时间:2024/06/02 04:59

先做个总结:

拦截器用于在服务器收到请求后对请求进行过滤,是否响应做出判断等。

1.因为在实现上,不可能神马都拦截,所以首先自定义一个拦截器,这个拦截器类要实现org.springframework.web.servlet.HandlerInterceptor

2.在拦截器中,有preHandle、afterCompletion、postCompletion 三个方法,其中 preHandle是在服务器开始响应之前就执行,post是在pre返回true、控制器调用完后执行,after在pre返回true、整个请求完成后执行

3.在spring配置中指定拦截器mvc:interceptors,以及需进行拦截的路径


关键步骤:

1.实现拦截器 HandlerInterceptor 接口

/** 
 * 拦截器必须实现HandlerInterceptor接口
 * */ 
public class AuthorizationInterceptor  implements org.springframework.web.servlet.HandlerInterceptor {


// 不拦截"/loginForm"和"/login"请求
private static final String[] IGNORE_URI = {"/loginForm", "/login"};

/** 
     * 该方法将在整个请求完成之后执行, 主要作用是用于清理资源的,
     * 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。 
     */  
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
System.out.println("AuthorizationInterceptor afterCompletion --> ");

}
/** 
     * 该方法将在Controller的方法调用之后执行, 方法中可以对ModelAndView进行操作 ,
     * 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。 
     */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
System.out.println("AuthorizationInterceptor postHandle --> ");

}


/** 
     * preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
     * 该方法的返回值为true拦截器才会继续往下执行,该方法的返回值为false的时候整个请求就结束了。 
     */  
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("AuthorizationInterceptor preHandle --> ");
// flag变量用于判断用户是否登录,默认为false 
boolean flag = false; 
//获取请求的路径进行判断
String servletPath = request.getServletPath();
// 判断请求是否需要拦截
        for (String s : IGNORE_URI) {
            if (servletPath.contains(s)) {
                flag = true;
                break;
            }
        }
        // 拦截请求
        if (!flag){
        // 1.获取session中的用户 
        User user = (User) request.getSession().getAttribute("user");
        // 2.判断用户是否已经登录 
        if(user == null){
        // 如果用户没有登录,则设置提示信息,跳转到登录页面
        System.out.println("AuthorizationInterceptor拦截请求:");
        request.setAttribute("message", "请先登录再访问网站");
        request.getRequestDispatcher("loginForm").forward(request, response);
        }else{
        // 如果用户已经登录,则验证通过,放行
        System.out.println("AuthorizationInterceptor放行请求:");
        flag = true;
        }
        }
        return flag;

}
}

2.在spring中配置拦截

   <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/*"/>
    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  
    <bean class="org.fkit.interceptor.AuthorizationInterceptor"/>
    </mvc:interceptor>
    </mvc:interceptors>


阅读全文
0 0
原创粉丝点击