拦截器Interceptor(实现局部拦截)

首先介绍一下拦截器及其作用:

1.拦截器一般在SpringMVC 框架的项目中使用。

2.作用:可以构成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。

3.拦截器执行流程:

(1)程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行;

(2)在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应;

(3)在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

下面看一下拦截器的具体实现的代码和配置:

1.声明一个自定义拦截器实现HandlerInterceptor 接口。这里是对登录功能做相应处理的拦截器。

/**
 * 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler)
			throws Exception {
		// 获取请求的URL
		String url = request.getRequestURI();
		// URL:除了登录请求外,其他的URL都进行拦截控制
		if (url.indexOf("/login") >=0) {
			return true;
		}
		// 获取Session
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("USER_SESSION");
		// 判断Session中是否有用户数据,如果有,则返回true,继续向下执行
		if (user != null) {
			return true;
		}
		// 不符合条件的给出提示信息,并转发到登录页面
		request.setAttribute("msg", "您还没有登录,请先登录!");
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
		                                        .forward(request, response);
		return false;
	}
	@Override
	public void postHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	@Override
	public void afterCompletion(HttpServletRequest request, 
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
}

2.去spring-config.xml配置文件中配置拦截器。

<!--配置静态资源的访问映射,此配置中的文件,将不被前端控制器拦截 -->
    <mvc:resources location="/js/" mapping="/js/**" />
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/fonts/" mapping="/fonts/**" />
    <mvc:resources location="/images/" mapping="/images/**" />
    <mvc:resources location="/tu/" mapping="/tu/**" />
    <mvc:resources location="/static/" mapping="/static/**" />
    <mvc:resources location="/data/" mapping="/data/**" />
<!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 局部拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <!--配置请求的访问映射,此配置中的请求,将不被前端控制器拦截 -->
            <mvc:exclude-mapping path="/index" />
            <mvc:exclude-mapping path="/toLogin" />
            <mvc:exclude-mapping path="/login" />
            <mvc:exclude-mapping path="/toRegister" />
            <mvc:exclude-mapping path="/registerUser" />
            <mvc:exclude-mapping path="/showTourism" />
            <mvc:exclude-mapping path="/findTourismByName" />
            <mvc:exclude-mapping path="/toCart" />
            <mvc:exclude-mapping path="/findCart" />

            <!--配置静态资源的访问映射,此配置中的文件,将不被前端控制器拦截 -->
            <mvc:exclude-mapping path="/js/**" />
            <mvc:exclude-mapping path="/css/**" />
            <mvc:exclude-mapping path="/fonts/**" />
            <mvc:exclude-mapping path="/images/**" />
            <mvc:exclude-mapping path="/tu/**" />
            <mvc:exclude-mapping path="/static/**" />
            <mvc:exclude-mapping path="/data/**" />
            <bean class="com.lzjtu.gaoyang.interceptor.LoginInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

需要注意的一点:

在上述局部拦截器配置中 ,需要设置排除在拦截之外的请求,这些请求将不经过拦截器。对于这些请求配置的位置只能如上所示,在拦截所有请求和拦截器类的配置之间。

到此,拦截器的局部拦截实现,可在浏览器进行访问验证。这里就不展示具体截图了。

最后这里搜集了拦截器和过滤器的区别:

1、过滤器基于函数回调、拦截器基于反射。

2、过滤器几乎对所有请求起作用,拦截器只对目标执行方法起作用。

3、过滤器对请求进行预处理、再交给Servlet处理并且生成响应,最后Filter再对服务器响应进行后处理;

拦截器可以在方法执行前调用(preHandle),方法执行后调用(postHandle),视图页面渲染后调用(afterCompletion)。
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值