[原创]struts拦截器的作用-登录验证版_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
7
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 12909 | 回复: 6   主题: [原创]struts拦截器的作用-登录验证版        下一篇 
    本主题由 funny 于 2013-3-14 16:35:07 置为精华
fangdingyu
注册用户
等级:少校
经验:1238
发帖:55
精华:25
注册:2013-3-6
状态:离线
发送短消息息给fangdingyu 加好友    发送短消息息给fangdingyu 发消息
发表于: IP:您无权察看 2013-3-6 14:29:15 | [全部帖] [楼主帖] 楼主

首先来区别一下拦截器与过滤器, 从原理上来说,这两者实质是一样的,但是有前提,所有的j2ee项目都可以使用过滤器,只有struts项目才能使用拦截器,因为他们属于不同的API.       
Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,如图1所示。

北京联动北方科技有限公司
图1拦截器调用序列图


已有的拦截器
Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。
以下部分就是从struts-default.xml文件摘取的内容:

< interceptor name ="alias" class ="com.opensymphony.xwork2.interceptor.AliasInterceptor" />
< interceptor name ="autowiring" class ="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
< interceptor name ="chain" class ="com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
< interceptor name ="conversionError" class ="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
< interceptor name ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor" />
< interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
< interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
< interceptor name ="execAndWait" class ="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
< interceptor name ="exception" class ="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
< interceptor name ="fileUpload" class ="org.apache.struts2.interceptor.FileUploadInterceptor" />
< interceptor name ="i18n" class ="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
< interceptor name ="logger" class ="com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
< interceptor name ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
< interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
< interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
< interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
< interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
< interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor" />
< interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor" />
< interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
< interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
< interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor" />
< interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
< interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor" />
< interceptor name ="workflow" class ="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
< interceptor name ="store" class ="org.apache.struts2.interceptor.MessageStoreInterceptor" />
< interceptor name ="checkbox" class ="org.apache.struts2.interceptor.CheckboxInterceptor" />
< interceptor name ="profiling" class ="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />


在此基础上,可以往此栈上加新的内容.配置如下.

<interceptors>
<interceptor name="validate"
class="com.fdy.oa.struts2.interceptor.ValidateLoginInterceptor"></interceptor>
<interceptor-stack name="oaStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="validate"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="oaStack"></default-interceptor-ref>


将自定义拦截器配置到栈中.
自定义拦截器的源码;

package com.fdy.oa.struts2.interceptor;
import com.fdy.oa.struts2.action.LoginAction;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class ValidateLoginInterceptor implements Interceptor {
      /**
      *
      */
      private static final long serialVersionUID = 1L;
      public void destroy() {
      }
      public void init() {
      }
      public String intercept(ActionInvocation invocation) throws Exception {
            // invocation持有Action引用
            Object action = invocation.getAction();
            if (action instanceof LoginAction) {
                  invocation.invoke();
            } else {
            Object user = invocation.getInvocationContext().getSession().get(
            "user");
            if (user != null) {
                  invocation.invoke();
            }
      }
      return "login";
}
}


用户第一次登录时,session被放到了invocation中.
上述代码中invocation判断每一个action的类型,假如是LoginAction的话,就放行而不检查session.如果为其他类型,就要检查其类型.如果session中有值,就继续调用后面的组件,没有值,跳转到登陆界面. 注意上面的'user' ,‘login'都是struts的配置文件中的配置的result的名字.因为struts的filter被配置在了web.xml中,所以所有的请求都会经过这一步,也就对所有请求都进行了验证.
希望各位多加练习,早日成为我这样的前辈高人.哦呵呵呵呵!




赞(0)    操作        顶端 
fangdingyu
注册用户
等级:少校
经验:1238
发帖:55
精华:25
注册:2013-3-6
状态:离线
发送短消息息给fangdingyu 加好友    发送短消息息给fangdingyu 发消息
发表于: IP:您无权察看 2013-3-6 14:30:43 | [全部帖] [楼主帖] 2  楼

楼主英明!楼主厉害啊!



赞(0)    操作        顶端 
FDY1
注册用户
等级:网站编辑
经验:436455203
发帖:23
精华:2
注册:2013-3-6
状态:离线
发送短消息息给FDY1 加好友    发送短消息息给FDY1 发消息
发表于: IP:您无权察看 2013-3-6 14:36:43 | [全部帖] [楼主帖] 3  楼

楼主厉害啊!其实我是马甲



赞(0)    操作        顶端 
hei_nihao
注册用户
等级:少校
经验:1279
发帖:19
精华:0
注册:2015-4-17
状态:离线
发送短消息息给hei_nihao 加好友    发送短消息息给hei_nihao 发消息
发表于: IP:您无权察看 2015-5-4 9:25:33 | [全部帖] [楼主帖] 4  楼

哈哈,自定义拦截器,楼主会自定义结果集吗?



赞(0)    操作        顶端 
dabusi
注册用户
等级:上士
经验:311
发帖:4
精华:0
注册:2015-5-4
状态:离线
发送短消息息给dabusi 加好友    发送短消息息给dabusi 发消息
发表于: IP:您无权察看 2015-6-1 9:06:32 | [全部帖] [楼主帖] 5  楼

,所有的j2ee项目都可以使用过滤器,只有struts项目才能使用拦截器

”,这好像是一个面试题。楼主写的不错,通过strut2的拦截器,可以很好地做权限的控制,最经strut2的东西很多都忘了,这篇文章又让我回忆起什么了,感谢

北京联动北方科技有限公司



赞(0)    操作        顶端 
llei.zhang
注册用户
等级:中尉
经验:492
发帖:18
精华:0
注册:1970-1-1
状态:离线
发送短消息息给llei.zhang 加好友    发送短消息息给llei.zhang 发消息
发表于: IP:您无权察看 2015-6-4 9:57:03 | [全部帖] [楼主帖] 6  楼

没用过自定义拦截器,学习下



赞(0)    操作        顶端 
yr
注册用户
等级:少校
经验:1085
发帖:5
精华:0
注册:2015-1-19
状态:离线
发送短消息息给yr 加好友    发送短消息息给yr 发消息
发表于: IP:您无权察看 2015-6-5 8:52:56 | [全部帖] [楼主帖] 7  楼

好自恋的前辈高人,哦呵呵呵呵



赞(0)    操作        顶端 
总帖数
7
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论