SpringMVC的拦截器和过滤器与拦截器的区别的区别与联系

浅谈springMVC拦截器和过滤器总结
作者:龚细军
字体:[ ] 类型:转载 时间:
本篇文章主要介绍了springMVC拦截器和过滤器总结,可以用来对访问的url进行拦截处理,有兴趣的可以了解一下。
拦截器: 用来对访问的url进行拦截处理
用处: 权限验证,乱码设置等
spring-mvc.xml文件中的配置:
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/tx
&!--编写拦截器--&
&mvc:interceptors&
&!--对特定的url拦截--&
&mvc:interceptor&
&mvc:mapping path="/test.do"/&
&bean class="com.hbut.interceptor.TestInterceptor"/&
&/mvc:interceptor&
&mvc:interceptor&
&!--对特定的模块拦截第一级别拦截--&
&mvc:mapping path="/test/×/"/&
&bean class="com.hbut.interceptor.TestInterceptor1"/&
&/mvc:interceptor&
&mvc:interceptor&
&!--对特定的模块拦截--&
&mvc:mapping path="/test/×"/&
&bean class="com.hbut.interceptor.TestInterceptor2"/&
&/mvc:interceptor&
&/mvc:interceptors&
对所有的url进行拦截
&mvc:interceptors&
&bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/&
&/mvc:interceptors&
package com.hbut.
import org.springframework.web.servlet.HandlerI
import org.springframework.web.servlet.ModelAndV
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
* @Author XiJun.Gong
com.hbut.interceptor
public class TestInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//todo 在此处添加要操作code
System.out.println("preHandle");
//todo 此处为false时,请求不会到达control层
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle"); //todo 可以用来修改信息,跳转等
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion"); //todo 最后执行
另一种拦截器:大同小异
package com.hbut.
import org.springframework.ui.ModelM
import org.springframework.web.context.request.WebR
import org.springframework.web.context.request.WebRequestI
* @Author XiJun.Gong
com.hbut.interceptor
public class Test2Interceptor implements WebRequestInterceptor {
public void preHandle(WebRequest webRequest) throws Exception {
public void postHandle(WebRequest webRequest, ModelMap modelMap) throws Exception {
public void afterCompletion(WebRequest webRequest, Exception e) throws Exception {
过滤器: 依赖于servlet容器,使用回调函数,过滤范围大
拦截器: 依赖于框架容器 比如spring、mybatis ,灵活
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具springmvc拦截器登录验证示例
作者:书剑江山
字体:[ ] 类型:转载 时间:
本篇文章主要介绍了springmvc拦截器登录验证示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一开始,学了拦截器与过滤器,咋一看两者有点像,实际上两者有很大的不同。就用拦截器和过滤器分别做了登录验证试验,这次先说拦截器。下面是自己实践的一个实例:
在spring-mvc.xml中配置拦截器:
&mvc:interceptors&
&mvc:interceptor&
&mvc:mapping path="/user/*"/&
&!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --&
&bean class="com.wyb.interceptor.LoginInterceptor"/&
&/mvc:interceptor&
&/mvc:interceptors&
如上所示,这里配置了LoginIntercepter,为了简单起见,该过滤器只拦截了URL为"/user/*"的请求。
要拦截的请求对应控制器如下:
import java.util.ArrayL
import java.util.L
import javax.annotation.R
import javax.servlet.http.HttpServletR
import org.apache.log4j.L
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.C
import org.springframework.ui.M
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.ResponseB
import com.wyb.domain.U
import com.wyb.service.IUserS
import com.wyb.service.impl.UserServiceI
@Controller
@RequestMapping("/user")
public class UserController {
   private static final Logger LOG=Logger.getLogger(UserController.class);
   @Autowired
   private IUserService userS
@RequestMapping("/showAllUser")
public String showAllUser(Model m){
List&User& userlist=new ArrayList&User&();
userlist=userService.findAllUser();
for(User user :userlist){
System.out.println(user.getUserName());
return "/jsp/showAllUser";
这里的showAllUser()方法是为了输出所有的用户,为了表明执行了方法,将所有用户在后台打印,URL为:http://localhost:8080/TestSSM/user/showAllUser,可见该URL肯定会被LoginIntercepter拦截。
测试页面showAllUser.jsp如下:
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&show All User&/title&
this is showAllUser Page!!!
LoginIntercepter如下:
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import org.springframework.web.servlet.HandlerI
import org.springframework.web.servlet.ModelAndV
import com.wyb.domain.U
public class LoginInterceptor implements HandlerInterceptor{
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("this is afterCompletion of LoginInterceptor");
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("this is postHandle of LoginInterceptor");
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("this is preHandle of LoginInterceptor");
HttpSession session=request.getSession();
User user=(User)session.getAttribute("user");
if(user==null){
System.out.println("no user in LoginInterceptor!!!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//返回true代表继续往下执行
&这里我犯了一个错误,聪明的小伙伴也许已经看出来了,如果按照上面的代码,当我们访问:http://localhost:8080/TestSSM/user/showAllUser结果如下:
咋一看,成功拦截了,输入用户名信息,正常跳转到主页,再次进入http://localhost:8080/TestSSM/user/showAllUser如下:
页面正常输出,已经记录了session,不会被再次拦截,看似成功了,可是看看后台输出:
有没有发现,我们执行了两次showAllUser()方法,可见第一次访问虽然被拦截器拦截了下来进入登录页面,但后台已经悄悄执行了showAllUser()。为什么呢?我们回头再看看LoginIntercepter.java,尤其是preHandle()方法:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("this is preHandle of LoginInterceptor");
HttpSession session=request.getSession();
User user=(User)session.getAttribute("user");
if(user==null){
System.out.println("no user in LoginInterceptor!!!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//返回true代表继续往下执行
在判断user为空后,虽然执行了页面跳转,但是程序还是会继续执行,最后返回true,返回true意味着,被拦截的业务逻辑可以继续往下执行,因此,虽然表面上被拦截了,但从本质上来说并没有拦截到。因此需要修改如下:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("this is preHandle of LoginInterceptor");
HttpSession session=request.getSession();
User user=(User)session.getAttribute("user");
if(user==null){
System.out.println("no user in LoginInterceptor!!!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//本次访问被拦截,业务逻辑不继续执行
//返回true代表继续往下执行
user为空,跳转后,返回false,就不会执行被拦截的业务逻辑了,修改后后台输出如下:
现在后台正常输出,且session保存了user信息后,才能执行showAllUser()方法,大功告成!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具SpringMVC 过滤器Filter使用解析 - 推酷
SpringMVC 过滤器Filter使用解析
SpringMVC框架是一个成熟的优秀java web开发框架,学习研究框架设计有助于我们更好的理解和掌握spring MVC,设计和写出更符合的结构和代码。
本节主要是研读SpringMVC框架中的过滤器设置,以编码处理过滤器为例来学习框架内是怎样设置过滤器的。
如上所示的spring-web.jar包结构所示, Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter,
不过实现的方式有以下几类:
(1) 直接实现Filter,这一类过滤器只有CompositeFilter;
(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;
(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。
过滤器放在容器结构的什么位置?
过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。&主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
Filter 有如下几个种类:
l& 用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。
l& 日志Filter: 详细记录某些特殊的用户请求。
l& 负责解码的Filter: 包括对非标准编码的请求解码。
l& 能改变XML 内容的XSLTFilter 等。
Filter 有如下几个用处 :
l& 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
l& 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
l& 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
l& 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
创建一个 Filter 只需两个步骤
(1)创建Filter 处理类:&
(2)在web.xml 文件中配置Filter 。
创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。
o void init(FilterConfig config): 用于完成Filter 的初始化。&
o void destroy(): 用于Filter 销毁前,完成某些资源的回收。&
o void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。&
过滤器Filter也具有生命周期:init()-&doFilter()-&destroy(),由部署文件中的filter元素驱动。
参照编码过滤器示例来查看怎么实现的
首先配置在web.xml文件里的规则如下
&!-- 编码处理过滤器 --&
&filter-name&encodingFilter&/filter-name&
&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&
&init-param&
&param-name&encoding&/param-name&
&param-value&utf-8&/param-value&
&/init-param&
&init-param&
&param-name&forceEncoding&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&encodingFilter&/filter-name&
&url-pattern&*.do&/url-pattern&
&/filter-mapping&
其中,filter-class 为过滤器Filter类,init-prama为注入的set参数
Filter-mapping中的url-pattern为过滤的url类型
类的继承关系
CharacterEncodingFilterr类继承了 OncePerRequestFilter 类
public class CharacterEncodingFilter extends OncePerRequestFilter
而 OncePerRequestFilter 类又继承了 GenericFilterBean 类
public abstract class OncePerRequestFilter extends GenericFilterBean
public abstract class GenericFilterBean implements
Filter, BeanNameAware, EnvironmentAware, ServletContextAware, InitializingBean, DisposableBean
设置编码的核心代码为
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
filterChain.doFilter(request, response);
其中filterChain为过滤器链,表示执行完这个过滤器之后接着执行下一个过滤器
我们在使用过滤器时,通常没必要知道GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter,但不防碍我们了解这几个类,就上文所述,AbstractRequestLoggingFilter继承自OncePerRequestFilter,OncePerRequestFilter继承自GenericFilterBean,所以我们知道,genericFilterBean是任何类型的过滤器的一个比较方便的超类,这个类主要实现的就是从web.xml文件中取得init-param中设定的值,然后对Filter进行初始化(当然,其子类可以覆盖init方法)。
OncePerRequestFilter继承自GenericFilterBean,那么它自然知道怎么去获取配置文件中的属性及其值,所以其重点不在于取值,而在于确保在接收到一个request后,每个filter只执行一次,它的子类只需要关注Filter的具体实现即doFilterInternal。
AbstractRequestLoggingFilter是对OncePerRequestFilter的扩展,它除了遗传了其父类及祖先类的所有功能外,还在doFilterInternal中决定了在过滤之前和之后执行的事件,它的子类关注的是beforeRequest和afterRequest。
总体来说,这三个类分别执行了Filter的某部分功能,当然,具体如何执行由它们的子类规定,若你需要实现自己的过滤器,也可以根据上文所述继承你所需要的类。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致2016年1月 Java大版内专家分月排行榜第一2015年12月 Java大版内专家分月排行榜第一2015年9月 Java大版内专家分月排行榜第一2015年8月 Java大版内专家分月排行榜第一
2016年3月 Java大版内专家分月排行榜第二2016年2月 Java大版内专家分月排行榜第二2015年11月 Java大版内专家分月排行榜第二2015年10月 Java大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 拦截器 过滤器区别 的文章

 

随机推荐