一、拦截器使用场景:处理请求共同问题
1、解决乱码问题 比如在preHandle 方法中使用arg0.setCharacterEncoding("utf-8");当然也可在web.xml配置spring自带编码过滤器拦截器: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>
总结:
拦击器可以处理web应用请求的一些通用性问题
公共问题在拦截器中处理 可以减少代码的重复 便于维护