您的位置:首页 > 编程语言 > Java开发

SpringMVC拦截器

2016-11-07 14:49 232 查看

SpringMVC拦截器

拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。

使用场景:解决请求的共性问题(如:乱码问题、权限验证问题等)。

例如,乱码问题,在form表单中有中文时,可能会出现乱码,可以在
web.xml
中配置一个Filter:

<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


拦截器的工作原理和过滤器非常相似。

拦截器的实现:

1.编写拦截器类是实现HandlerInterceptor接口

2.将拦截器注册进SpringMVC框架中

<!--注册拦截器  -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/viewAll"/>
<bean class="com.springmvc.interceptor.Test1Interceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>


3.配置拦截器的拦截规则

拦截器方法

1.
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception


返回值:是否需要将当前的请求拦截下来,如果返回
false
,请求会被终止。如果返回
true
,请求会被继续。

Object arg2
表示的是被拦截的请求的目标对象。

2.
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)


可以通过ModelAndView参数来改变显示的视图,或修改发往视图的方法。

3.
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)


请求结束响应之后,最后调用的方法。

多个拦截器应用

在SpringMVC的配置文件,配置如下的两个拦截器:

<!--注册拦截器  -->
<mvc:interceptors>
<bean class="com.springmvc.interceptor.Test1Interceptor"></bean>
<bean class="com.springmvc.interceptor.Test2Interceptor"></bean>
</mvc:interceptors>


运行后,控制台输出的顺序如下:

执行了preHandle1方法...
执行了preHandle2方法...
进入了控制器的viewAll()方法...
name=小胖
pwd=123
执行了postHandle2方法...
执行了postHandle1方法...
执行了afterCompletion2方法...
执行了afterCompletion1方法...


执行过程如下:



拦截器的其它实现方式

也可以实现
WebRequestInterceptor
接口,向SpringMVC框架注册的写法是不变的。弊端是:
preHandler
方法没有返回值,不能终止请求。

public class Test3Interceptor implements WebRequestInterceptor{

@Override
public void afterCompletion(WebRequest arg0, Exception arg1) throws Exception {

}

@Override
public void postHandle(WebRequest arg0, ModelMap arg1) throws Exception {

}

@Override
public void preHandle(WebRequest arg0) throws Exception {

}

}


拦截器的使用场景

1.解决乱码问题

@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("执行了preHandle1方法...");
arg0.setCharacterEncoding("utf-8");
return true;
}


2.解决权限验证问题

@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("执行了preHandle1方法...");
arg0.setCharacterEncoding("utf-8");

//对用户是否登录进行判断
if (arg0.getSession().getAttribute("user") == null) {
//如果用户没有登录,就终止请求,并发送到登录页面
arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);
return false;
}

return true;
}


拦截器和过滤器的区别

过滤器
Filter
依赖于Servlet容器,基于回调函数,过滤范围大

拦截器
Interceptor
依赖于框架容器,基于反射机制,只过滤请求。

参考

Spring MVC拦截器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc 拦截器