一、拦截器使用场景:处理请求共同问题
1、解决乱码问题 比如在preHandle 方法中使用arg0.setCharacterEncoding("utf-8");当然也可在web.xml配置spring自带编码过滤器2、解决权限认证问题
二、拦截器与过滤器的区别:
过滤器:Filter接口依赖servlet容器,基于回调函数 过滤范围大 比如资源、action请求
拦截器:Interceptor依赖于框架基于反射机制 只过滤请求
三、SpringMVC 拦截器实现:编写一个类继承HandlerInterceptor接口 实现其中方法 然后在springmvc.xml中配置注册即可
如下配置:
<!-- 扫描包 -->
<context:component-scan base-package="com.test.*"/>
<!-- 开启注解 -->
<mvc:annotation-driven />
<!-- 拦击器注册 -->
<mvc:interceptors>
<!-- 此种配置拦击所有请求 -->
<!-- <bean class="com.test.mvc.SpringMVCInterceptor"></bean> -->
<mvc:interceptor>
<!-- 配置对某些请求拦截 自定义 -->
<mvc:mapping path="/view.html" />
<bean class="com.test.mvc.SpringMVCInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 视图解释类 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
package com.test.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SpringMVCInterceptor implements HandlerInterceptor{
/**
* 请求结束后调用的方法 比如关闭资源 此方法用的少
*/
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
/**
* ModelAndView 改变值 改变跳转地址
* 可以通过
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
// arg3.addObject("msg", "改变值");
// arg3.setViewName("/vs.jsp");
}
/**
* 返回值:表示是否将当前请求拦截下来 false拦截将被终止 true 继续执行
* org2 表示拦截请求目标对象
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
//arg0.setCharacterEncoding("utf-8");
//比如登陆
if(arg0.getSession().getAttribute("user")!=null){
return true;
}
return false;
}
}
package com.test.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.portlet.ModelAndView;
@Controller
@RequestMapping("/")
public class ViewController {
@RequestMapping(value="/view.html",method=RequestMethod.POST)
public ModelAndView view(String name,String pwd){
System.out.println(name+"...................."+pwd);
return new ModelAndView("view");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 使用springmvc 对编码进行过滤 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding </param-name>
<param-value>UTF8 </param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<!-- 配置springMVC -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/config/sping-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
其他实现方法实现接口WebRequestInterceptor用法与HandlerInternet方法差不多 有些细节区别比如:preHandle在WebRequestInterceptor没有返回值无法终止请求 一般用HandlerInterceptor 实现类
总结:
拦击器可以处理web应用请求的一些通用性问题
公共问题在拦截器中处理 可以减少代码的重复 便于维护