springMVC 拦截器简单配置

在spring 3.0甚础上,起来越多的用到了注解,从前的拦截器在配置文件中需要这样配置

<beans...>


...

<bean id="measurementInterceptor"

class="com.apress.springrecipes.court.web.MeasurementInterceptor"/>

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="interceptors">

<list>

<ref bean="measurementInterceptor"/>

</list>

</property>

...

</bean>

<bean class="org.springframework.web.servlet.mvc.support

.ControllerClassNameHandlerMapping">

<property name="interceptors">

<list>

<ref bean="measurementInterceptor"/>

</list>

</property>

</bean>

....

</beans>

·        现在用注解只需要这样:

<mvc:interceptors>

<mvc:interceptor>

<mvc:mapping path="/*/*.shtml"/>//映射路径后缀名

<bean class="x.x.x.filter.SessionFilter"/>//自定义拦截器

</mvc:interceptor>

</mvc:interceptors>

SessionFilter.java代码:

publicclass SessionFilter implements HandlerInterceptor{

@Override

publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response, Object o) throws Exception{

//  后台session控制

Objectuser=request.getSession().getAttribute("username");

String returnUrl = request.getRequestURI();

if(null==user){

if(returnUrl.equals("/public/getImg.shtml")||returnUrl.equals("/public/checkLogin.shtml")||returnUrl.equals("/public/login.shtml")||returnUrl.equals("/public/logOut.shtml")){

returntrue;

}else{

response.setContentType("text/html");

response.setCharacterEncoding("utf-8");

PrintWriter out =response.getWriter();

StringBuilder builder = new StringBuilder();

builder.append("<script type=\"text/javascript\"charset=\"UTF-8\">");

builder.append("alert(\"请重新登陆!\");");

builder.append("window.location.href=\"/public/login.shtml\";");

builder.append("</script>");

out.print(builder.toString());

out.close();

returnfalse;

}

}

returntrue;

}

@Override

publicvoidpostHandle(HttpServletRequest httpServletRequest, HttpServletResponse response,Object o, ModelAndView modelAndView) throws Exception {

}

@Override

publicvoidafterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse response, Object o, Exception e) throws Exception{

}

/**

* @paramrequest

* @returnCreate Date:2016-07-31

* Description:获取IP

*/

private String getIpAddr(HttpServletRequestrequest) {

String ip = request.getHeader("x-forwarded-for");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return ip;

}

}

这个拦截器的目的就是:用户所属的session不存在后进行对控制器请求的拦截,使跳转到首页。对于HandlerInterceptor这个类这里不多说,网上有的可能说的更好,这里只简单说下它的三个方法,preHandle、postHandle和afterCompletion。

(1)preHandle(WebRequest request) 方法。该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。这个方法跟HandlerInterceptor中的preHandle 是不同的,主要区别在于该方法的返回值是void,也就是没有返回值,所以我们一般主要用它来进行资源的准备工作,比如我们在使用hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,然后利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的属性中。这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:

SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。

SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。

SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问。

(2)postHandle(WebRequest request, ModelMap model) 方法。该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,比如在preHandle 中准备的数据都可以通过WebRequest 来传递和访问;ModelMap 就是Controller 处理之后返回的Model 对象,我们可以通过改变它的属性来改变返回的Model 模型。

(3)afterCompletion(WebRequest request, Exception ex) 方法。该方法会在整个请求处理完成,也就是在视图返回并被渲染之后执行。所以在该方法中可以进行资源的释放操作。而WebRequest 参数就可以把我们在preHandle 中准备的资源传递到这里进行释放。Exception 参数表示的是当前请求的异常对象,如果在Controller中抛出的异常已经被spring 的异常处理器给处理了的话,那么这个异常对象就是是null 。

参考:http://haohaoxuexi.iteye.com/blog/1750680

时间: 2024-10-06 22:58:38

springMVC 拦截器简单配置的相关文章

springMVC拦截器简单配置

<!-- 拦截器 -->    <mvc:interceptors>        <mvc:interceptor>            <!-- 拦截所有.action结尾的请求 -->            <mvc:mapping path="/**/*.action"/>                        <bean class="com.interceptor.WebManageInt

SpringMVC拦截器简单使用

一.拦截器的配置 1.传统的配置 xml代码 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" > <property name="interceptors"> <!-- 多个拦截器,顺序执行 --> <list> <ref bean="commonIntercepto

Springboot中SpringMvc拦截器配置与应用(实战)

一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式. 拦截器的使用场景越来越多,尤其是面向切片编程流行之后.那通常拦截器可以做什么呢? 之前我们在Agent介绍中,提到过统计函数的调用耗时.这

SpringMVC 拦截器理解

SpringMVC 配置拦截器 1. 作为拦截器当然是为了拦截 (这不是废话嘛) 那拦截是为了干嘛? 它可以帮我们拦截未登录用户   验证是否登录.设置日志记录.统计一些接口访问量啊 进行统一异常处理  设置一些数据啊 或者计算下应用接口方法执行效率啊 等等   2. 配置拦截器 由于用的是SpringMVC所以要知道 它是有个统一的 DispatcherServlet 控制器, 所以就不用传统的bean方式了,人家给我们提供了其他简单的方式 如下所示:  (我设置了三个方便测试用的) <!--

SpringMVC拦截器(实现登录验证拦截器)

本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 St

SpringMVC拦截器的使用

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间. 一.springMVC拦截器的实现方式 springMVC拦截器的实现一般有两种方式:第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口.第二种方式是继承实现了HandlerInterceptor接口的类,比

springmvc 拦截器使用注意点

最近到springmvc 拦截器的时候 死活不起作用.查了下原因,spring 配置文件中有这样一句 <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> &l

springmvc拦截器使用和原理理解

与struts2类似,springmvc的拦截器主要作用也是在服务端真正处理请求前后进行一些相关的操作. 例如初始化资源,权限监控,会话设置,菜单获取,资源清理等. 步骤: 1. 定义拦截器 自定义拦截器一般继承自HandlerInterceptorAdapter 或者实现 HandlerInterceptor 接口. 实现接口需要实现对应的3中方法,继承父类只需要实现需要的方法即可.preHandle,postHandle,afterCompletion public class MyInte

SpringMVC 拦截器 异常

27.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必 须实现HandlerInterceptor接口 1.自定义实现类实现 HandlerInterceptor接口 2.在springmvc配置文件中配置相对应的拦截器 <mvc:interceptors> <!--配置自定义拦截器 ,所有的路径都拦截 --> <bean class="com.neuedu.springmvc.filter