SrpingMVC 拦截器

一、拦截器使用场景:处理请求共同问题

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应用请求的一些通用性问题
公共问题在拦截器中处理 可以减少代码的重复 便于维护

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值