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 可以在晚上找几篇博文看一下了解即可.
来源: https://www.cnblogs.com/Mrchengs/p/9955509.html