未进化的程序猿
人生最苦痛的是梦醒了无路可走。做梦的人是幸福的;倘没有看出可走的路,最要紧的是不要去惊醒他。鲁迅

1、目的:拦截器的配置主要是对请求进行相应的处理(在登录和session过时的时候是一个很好的方式)

2、由于Spring容器的优越性,在配置的时候全部交给容器管理是一个很不错的方式

3、配置拦截器:

1)在对应的方式类中实现HandlerInterceptor接口,会要求实现3个方法

package com.gmw.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class CustomerInterceptor implements HandlerInterceptor {

    // controller执行后且视图返回后调用此方法
    // 这里可得到执行controller时的异常信息
    // 这里可记录操作日志

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    // controller执行后但未返回视图前调用此方法
    // 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    // Controller执行前调用此方法
    // 返回true表示继续执行,返回false中止执行
    // 这里可以加入登录校验、权限拦截等

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {return false;
    }

}

2)所有的请求都会在拦截器里面经过,这样在做登录拦截的时候会起到数据的保护和相关的展示限权 在preHandle方法里面加入自己的逻辑

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object obj) throws Exception {
         
        //获取判定登陆的session是否存在
        String token = (String) request.getSession().getAttribute("token");
        String postId = (String) request.getSession().getAttribute("postId");
        if(token == null || token == ""){
            String XRequested =request.getHeader("X-Requested-With");
            if("XMLHttpRequest".equals(XRequested)){
                response.getWriter().write("IsAjax");
            }else{
                response.sendRedirect("/m-web/");
            }
            return false;
        }
        if(postId == null || postId == ""){
            String XRequested =request.getHeader("X-Requested-With");
            if("XMLHttpRequest".equals(XRequested)){
                response.getWriter().write("IsAjax");
            }else{
                response.sendRedirect("/m-web/");
            }
            return false;
        }
        return true;
    }

3)、在Spring的配置文件里面加入

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/user/login"/>
            <mvc:exclude-mapping path="/user/loginOut"/>
            <mvc:exclude-mapping path="/user/setPostId"/>
            <mvc:exclude-mapping path="/user/getPostId"/>
            <mvc:exclude-mapping path="/resources/**"/>
            <mvc:exclude-mapping path="/assets/**"/>
            <mvc:exclude-mapping path="/css/**"/>
            <mvc:exclude-mapping path="/fonts/**"/>
            <mvc:exclude-mapping path="/images/**"/>
            <mvc:exclude-mapping path="/img/**"/>
            <mvc:exclude-mapping path="/js/**"/>
            <mvc:exclude-mapping path="/pic/**"/>
            <mvc:exclude-mapping path="/plugins/**"/>
            <mvc:exclude-mapping path="/static/**"/>
            <mvc:exclude-mapping path="/ui/**"/>
       <!-- 配置具体的拦截器-->
            <bean class="com.troy.ai.web.Interceptors.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

4)、解释:

<mvc:mapping path="/**"/>  //是对所有路径进行过滤
<mvc:exclude-mapping path="/user/login"/>  //是对该路径进行放行
<mvc:exclude-mapping path="/ui/**"/>  //是对静态资源加载放行
<bean class="com.troy.ai.web.Interceptors.LoginInterceptor"/>  //指定处理拦截的相关类

5)、拦截器的配置相对简单,但是在实际的应用过程却非常常见,逻辑处理方面需要根据实际来处理

 

posted on 2020-11-30 19:06  甘茂旺  阅读(91)  评论(0编辑  收藏  举报