zoukankan      html  css  js  c++  java
  • springmvc(5)拦截器

    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可以在晚上找几篇博文看一下了解即可。

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    怎么在本地建立一个Maven 项目push到码云(https://git.oschina.net)
    SmartGit(试用期30后),个人继续使用的方法。
    小项目的总结
    Http 协议简略
    servlet 的基础学习
    安卓访问https错误,访问http可以,可能是nginx ssl证书配置有问题
    EF Code first主从表,删除更新从表
    MSSQL 生成唯一自增数据的办法
    select2插件placeholder不显示的问题
    FormData的Ajax提交注意事项
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/9955509.html
Copyright © 2011-2022 走看看