struts 拦截器和struts2过滤器配置的区别和原理

拒绝访问 | www.ggdoc.com | 百度云加速
请打开cookies.
此网站 (www.ggdoc.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3dbabcaefdaa43e9-ua98).
重新安装浏览器,或使用别的浏览器Struts2中拦截器与过滤器的执行顺序
通过上图可以看到,顺序应该是我们配的filter在前,之后是struts2的FilterDispatcher,然后是各个拦截器,最后原路返回。
下面我们来验证一下:
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app version=&2.4&
& & & & xmlns=&http://java.sun.com/xml/ns/j2ee&
& & & & xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
& & & & xsi:schemaLocation=&http://java.sun.com/xml/ns/j2ee
& & & & http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&&
& &welcome-file-list&
& & &welcome-file&login.jsp&/welcome-file&
& &/welcome-file-list&
& &filter&
& & & & &filter-name&MyFilter&/filter-name&
& & & & &filter-class&filter.MyFilter&/filter-class&
& &/filter&
& &filter-mapping&
& & & & &filter-name&MyFilter&/filter-name&
& & & & &url-pattern&/*&/url-pattern&
& &/filter-mapping&
& &filter&
& & & & &filter-name&struts2&/filter-name&
& & & & &filter-class&org.apache.struts2.dispatcher.FilterDispatcher&/filter-class&
& &/filter&
& &filter-mapping&
& & & & &filter-name&struts2&/filter-name&
& & & & &url-pattern&/*&/url-pattern&
& &/filter-mapping&
&/web-app&
struts.xml&
&!DOCTYPE struts PUBLIC
& & & & &&-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&
& & & & &&http://struts.apache.org/dtds/struts-2.0.dtd&&
& & &&package name=&default& extends=&struts-default&&
& & && &&interceptors&
& & && && &&interceptor name=&loginInterceptor& class=&interceptor.LoginInterceptor& /&
& & && && &&interceptor-stack name=&loginStack&&
& & && && && &&interceptor-ref name=&loginInterceptor& /&
& & && && && &&interceptor-ref name=&defaultStack& /&
& & && && &&/interceptor-stack&
& & && &&/interceptors&
& & && &&default-interceptor-ref name=&loginStack&&&/default-interceptor-ref&
& & && &&global-results&
& & && && &&result name=&login&&/login.jsp&/result&
& & && &&/global-results&
& & && &&action name=&Login& class=&action.LoginAction&&
& & && && &&result&/index.jsp&/result&
& & && &&/action&
& & &&/package&
&&/struts&
&%@ page language=&java& import=&java.util.*& pageEncoding=&ISO-8859-1&%&
PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN&&
& & &title&My JSP 'index.jsp' starting page&/title&
& & &h3&Login&/h3&
& & &form action=&Login.action& method=&POST&&
& & & & : &input type=&text& name=&username& /&
& & & & &input type=&submit& value=&submit& /&
& & &/form&
&%@ page language=&java& import=&java.util.*& pageEncoding=&ISO-8859-1&%&
PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN&&
& & &title&My JSP 'index.jsp' starting page&/title&
& & &h3&Login Success!&/h3&
filter.MyFilter
import java.io.IOE
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.ServletR
import javax.servlet.ServletR
public class MyFilter implements Filter {
& & & & public void destroy() {
& & & & public void doFilter(ServletRequest request, ServletResponse response,
& & & & & & & & & & & & FilterChain chain) throws , ServletException {
& & & & & & & &
& & & & & & & & .out.println(&请求过滤&);
& & & & & & & &
& & & & & & & & chain.doFilter(request, response);
& & & & & & & &
& & & & & & & & .out.println(&返回过滤&);
& & & & & & & &
& & & & public void init(FilterConfig arg0) throws ServletException {
&interceptor.LoginInterceptor
import org.apache.struts2.ServletActionC
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
public class LoginInterceptor extends AbstractInterceptor {
& & & & private static final long serialVersionUID = -4355318L;
& & & & @Override
& & & & public
intercept(ActionInvocation ai) throws
& & & & & & & &
& & & & & & & & .out.println(&请求拦截&);
& & & & & & & &
& & & & & & & & if(!&YOYO&.equals(ServletActionContext.getRequest().getParameter(&username&))){
& & & & & & & & & & & & return &login&;
& & & & & & & & }
& & & & & & & &
& & & & & & & &
result = ai.invoke();
& & & & & & & &
& & & & & & & & .out.println(&返回拦截&);
& & & & & & & &
& & & & & & & & return
&action.LoginAction
public class LoginAction {
& & & & public
execute(){
& & & & & & & & .out.println(&登陆ACTION&);
& & & & & & & &
& & & & & & & & return &success&;
部署好后打开login.jsp,输入任意非&YOYO&字符,控制台打印出
&说明拦截之后还会按照原路返回;
如果输入&YOYO&,则打印出
登陆ACTION
由此可以验证它的执行顺序 = =。
当有新评论通过 E-mail 通知我
(输入验证码)
or Ctrl+Enter博客分类:
该过滤器的方法是创建一个类XXXFilter实现此接口,并在该类中的doFilter方法中声明过滤规则,然后在配置文件web.xml中声明他所过滤的路径
&filter-name&XXXFilter&/filter-name&
&filter-class&
com.web.util.XXXFilter
&/filter-class&
&filter-mapping&
&filter-name&XXXFilter&/filter-name&
&url-pattern&*.action&/url-pattern&
&/filter-mapping&Interceptor
该过滤器的方法也是创建一个类XXXInterceptor实现此接口,在该类中intercept方法写过滤规则,不过它过滤路径的方法和Filter不同,它与strut.xml结合使用,
创建一个strus.xml的子配置文件struts-l99-default.xml,它继承与struts2的struts-default,此配置文件是其他子配置文件的父类,只要是继承与该文件的配置文件所声明的路径都会被它过滤 如下 &package name="XXX-default" namespace="/" extends="struts-default"&
&interceptors&
&interceptor name="authentication" class="com.util.XXXInterceptor" /&
&interceptor-stack name="user"&
&interceptor-ref name="defaultStack" /&
&interceptor-ref name="authentication" /&
&/interceptor-stack&
&interceptor-stack name="user-submit"&
&interceptor-ref name="user" /&
&interceptor-ref name="token" /&
&/interceptor-stack&
&interceptor-stack name="guest"&
&interceptor-ref name="defaultStack" /&
&/interceptor-stack&
&interceptor-stack name="guest-submit"&
&interceptor-ref name="defaultStack" /&
&interceptor-ref name="token" /&
&/interceptor-stack&
&/interceptors&
&default-interceptor-ref name="user" /&
&/package& 比较一,filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于Java本身的反射机制,这是两者最本质的区别。 比较二,filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。 比较三,Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。 比较四,Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤。
转自:http://blog.csdn.net/pengsky2002/archive//2077441.aspx
浏览: 24784 次
来自: 西安
以前就是因为部署到linux,读取路径问题折腾了N天,终于弄出 ...
guoapeng 写道为什么不另外写一个bean将它配置在Sp ...
为什么不另外写一个bean
将它配置在Spring里面,
而非 ...
看上去有点牛逼~~
不错,谢谢分享。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)过滤器和拦截器的区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。&
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。&
4、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次&&
&------------------------------------详细解释--------------------------------------------
&拦截器:就是在你调用一个方法前,或者调用一个方法后,做一些业务逻辑的操作,例如打印字符串。&&
下面通过实例来看一下过滤器和拦截器的区别:&&
使用拦截器进行/admin&目录下jsp页面的过滤:&
&package&name="newsDemo"&extends="struts-default"&namespace="/admin"&&&&&&&&&&
&interceptors&&
&&&&&&&&&&&&&interceptor&name="auth"&class="com.test.news.util.AccessInterceptor"&/&&&&&&&&&&&&&&
&interceptor-stack&name="authStack"&&&&
&&&&&&&&&&&&&&interceptor-ref&name="auth"&/&&&&&
&&&&&&&&&&/interceptor-stack&&&&&&&&
&&&/interceptors&&&&&&&&&
&&!--&action&--&&
&&&&&&&&&action&name="newsAdminView!*"&class="newsAction"&method="{1}"&&
&&&&&&&&&&&&/interceptor-ref&&
&interceptor-ref&name="defaultStack"/&&
&&&&&&&&&&&&&interceptor-ref&name="authStack"&&&&&&&&&&&
&&&/interceptor-ref&&
&/action&&
&/package&
下面是我实现的拦截器:&&
package&com.test.news.&import&java.util.M&
import&com.opensymphony.xwork2.ActionC&import&com.opensymphony.xwork2.ActionI&
import&com.opensymphony.xwork2.interceptor.AbstractI&import&com.test.news.action.AdminLoginA&&
public&class&AccessInterceptor&extends&AbstractInterceptor&{&&
&&&&private&static&final&long&serialVersionUID&=&-0785705L;&&
&&&&public&String&intercept(ActionInvocation&actionInvocation)&throws&Exception&{&
&&&&&&&&&ActionContext&actionContext&=&actionInvocation.getInvocationContext();&
&&&&&&&&&Map&session&=&actionContext.getSession();&&&&&
&&&&&&&&&Object&action&=&actionInvocation.getAction();&&&&&&
if&(action&instanceof&AdminLoginAction)&{&&&&&&&&&&
&&&&&&&&&&&
return&actionInvocation.invoke();&&&&&&&&
&&&&&&&&//check&session&&&&&
&&&&&&&&if(session.get("user")==null&){
&&&&&&&&&&
return&"logout";&
&&&&&&&&return&actionInvocation.invoke();//go&on&&&&
}&}&&&&&&&&&
过滤器:就是在你访问某个JSP、Servlet或者Action之前,过滤掉一些信息。&
使用过滤器进行/admin&目录下jsp页面的过滤,首先在web.xml进行过滤&器配置:&&
&&&&&&&&&filter-name&access&filter&/filter-name&&&&
&&&&&&&filter-class&&
&&&&&&&&&&&&&com.test.news.util.AccessFilter&&&&&&&&
&&/filter-class&&&&
&&&/filter&&&&&&
&filter-mapping&&
&&&&&&&&&filter-name&access&filter&/filter-name&&&&&&
&url-pattern&/admin&/url-pattern&
&&&&/filter-mapping&
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 struts2的拦截器原理 的文章

 

随机推荐