1.什么是拦截器
是指通过统一的拦截从浏览器发送到服务器的请求来完成相应服务增强
2.拦截器的基本原理
可以通过配置过滤器解决乱码问题
和过滤器非常相似
3.搭建工程
注意jar包
此时的工程是完成后创建的
web.xml
<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:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
springmvc.xml
<context:component-scan base-package="com.Mrcheng.controller"></context:component-scan> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <mvc:annotation-driven></mvc:annotation-driven> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
ControllerTest.java
@Controller public class ControllerTest { @RequestMapping("/login") public String login(){ return "view"; } @RequestMapping("/view") public ModelAndView views(String name,String pwd){ ModelAndView mv = new ModelAndView(); System.out.println("views方法...."); System.out.println("name:" + name); System.out.println("pwd:" + pwd); mv.addObject("msg", "views方法中的msg"); mv.setViewName("success"); return mv; } }
index.jsp
用于向view.jsp做跳转
<body> This is my JSP page. <br> <a href="login">to login</a> </body>
view.jsp
主要做测试的页面
<form action="view" method="post"> user:<input type="text" name="name" ><br> pwd:<input type="password" name="pwd"><br> <input type="submit" value="submit"> </form> </body>
success.jsp
是view.jsp做跳转成功的页面测试
<body>
<h1>success</h1>
msg:${msg}
</body>
test.jsp
主要做拦截请求的测试
<body> <h4>拦截请求的转移测试</h4> </body>
在Tomcat上运行
乱码测试:
提交之后看控制台的打印结果:
此时输入中文的情况下会有乱码的情况出现
4.对乱码进行拦截和处理(过滤器)
在web.xml文件中配置filter
配置代码:
<param-name>encoding</param-name>固定值
<filter> <filter-name>filter</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>filter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
此时的测试中文是没有乱码的@!!!
5.拦截器的实现
自定义拦截器:
MyInterceptor.java
需要实现接口HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setCharacterEncoding("utf-8"); System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); } }
在springmvc.xml文件中注册:
<!-- 拦截器注册到mvc框架中 -->
<mvc:interceptors>
<bean class="com.MrChengs.Interceptor.MyInterceptor"></bean>
</mvc:interceptors>
拦截器的拦截规则:
拦截规则很多
<!-- 拦截器注册到mvc框架中 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/view.action"/> <bean class="com.MrChengs.Interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
6.拦截器的三种方法介绍
1.preHeader 在请求之前被调用
是否需要将当前的当前的请求拦截下来
为true表示进行拦截
为false表示不进行拦截,后面的两个方法不会执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler)
request:请求
response:响应
handler:拦截请求的目标的对象 此时是ControllerTest的views方法
2.postHandler 在请求处理被调用
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler,ModelAndView modelAndView)
modelAndView:可以改变显示的视图,或者修改方法发往的视图
测试代码:
3.afterCompletion 在请求结束之后才进行调用
主要用于关闭一些资源的操作
7.多个拦截器的使用
springmvc.xml配置文件
假设同时拦截所有的请求
<!-- 拦截器注册到mvc框架中 --> <mvc:interceptors> <bean class="com.MrChengs.Interceptor.MyInterceptor"></bean> <bean class="com.MrChengs.Interceptor.MyInterceptor2"></bean> </mvc:interceptors>
执行流程:
preHandle...
preHandle2...
views方法....
name:小明
pwd:xiaoming
postHandle2...
postHandle...
afterCompletion2...
afterCompletion...
当然拦截器的接口不止一个,但是我们在操作中使用最多的还是本次实验中的这个接口。
其余的HandlerInterceptor,WebRequestInterceptor可以在晚上找几篇博文看一下了解即可。