随笔-67  评论-522  文章-0  trackbacks-0
    通过之前的Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解系列文章,我们已经成功将这三种框架整合到了一起,这次大象将在此基础上用一个小实例来说明,怎么利用Struts2的拦截器特性实现登录验证,以及超时后的跳转问题。
    大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了。那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证。
    修改数据库
    user表中增加password字段,将初始密码都设为123,因为是示例所以采用明码,实际开发中,当然不能这样做,需要进行加密处理。再将name改为username,其实name字段可以不用改名,我这样做是为了命名规范,请注意,如果字段改为usernameUser类中的对应属性也要进行相应变化(如果你加注释写法可以不用改),还有TestTestHibernateDao中的getName()都要改为getUsername()
    修改index.jsp
    hello.action改为login!welcome.action
    增加登录类
    web包下创建LoginAction类,在其中添加welcomelogin方法,前者为index.jsp的跳转方法,它将转向到login.jsp页面。而后者则用来处理登录事件,如果成功将进入到主页面,失败则返回到登录页面。最后面有源码下载,这里省略。
    增加拦截器
    要实现登录拦截的功能,最关键的就是要实现拦截类了,在common包下面再增加一个interceptor包,创建AuthorityInterceptor类,并继承MethodFilterInterceptor,为什么继承它呢?因为它是对方法进行拦截,而在这个应用中,我们是对绝大部分的方法进行拦截,而对个别例外的方法排除。
    
    session中取得当前登录用户,如果存在,就继续执行后面的拦截器;否则,就跳转到登录页面。所以这样实现了代码后,还要在struts.xml中进行相应的设置。
    增加拦截器配置
   
    做好这一步之后,那么登录验证拦截器将会对除了welcomelogin之外的所有方法进行拦截了。另外我想说下,拦截器的实现还有一种注解的方式,它不需要实现拦截器类,只需要指定一个注解类型和一个拦截方法就可以了,具体的请自己去查相关资料。这里我没采取注解方式是因为它只能应用到方法级别,不能进行代码复用,如果有多个Action都需要执行拦截操作,那么就得把同样的注解方法复制到不同的Action中,这无疑是很糟糕的。而使用拦截器类就简单多了,只需要在配置文件中指定它,并引用它,就可以在任意的Action中生效,也没有侵入式代码,这就是常说的AOP切面,struts2的拦截器就是AOP的一个具体实现。
    增加全局转向配置
   
    还记得拦截器里面的return Action.LOGIN 这句吧,当程序执行完这一行后,就会到struts.xml文件中去找namelogin全局转向配置,因此这里我设置为一个jsp页面,而没有定义成/login!welcome.action就是因为如果按这样做了,那么转向后,登录页面将显示在iframe框架中,这肯定不是我们希望看到的。解决这个问题,网上有很多方法,我查了一下,再结合实际,其实没那么复杂,一句话就可以搞定。如果使用frameset这种做法也有效,大象同样测试过,只不过例子中的代码没有这样写而已。
    增加jump.jsp
   
    增加login.jsp
    登录页面,输入用户名与密码,因为是例子,所以我没加验证码,在正式开发中应该加上。
   
    增加login-index.jsp
    这是登录成功后转向的页面,在这里,我用iframe框架来显示内容。
   
    到这里,所有工作都已经完成,已经可以登录登出了,并且拦截器也可以正常工作,超时登出也没问题,大家下载例子运行看看吧!
    源码下载: ssh2-interceptor
    本文为菠萝大象原创,如要转载请注明出处。http://bolo.blogjava.net/
posted on 2010-08-28 14:14 菠萝大象 阅读(28925) 评论(12)  编辑  收藏 所属分类: Struts2

评论:
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-05-09 11:40 | taote
大象好久没有更新博客了!!!!!  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-06-03 14:04 | bryan
水印图案让人看起来很不舒服,可以将字变大,少点.  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-06-03 14:16 | 菠萝大象
@bryan
这已经是很大的字号了,再大,会很丑,我试过,图片的显示只是帮助文章进行说明,具体的请看源代码,另外你说看起来很不舒服?我感觉还好吧,可能是你没习惯而已,不要太计较图片水印,关键是我的东西对你有没有用,看个开头就知道是否要继续看下去,如果不适合你,请立马关掉网页,不要对水印这些无关紧要的东西纠结来纠结去了,只要不影响阅读就行,如果你实在不爽,那不看总可以吧  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-06-17 00:33 | 王德超
很好  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-08-03 10:58 | gameover
<interceptor-ref name="authority">
<param name="excludeMethods">welcome,login</param>
</interceptor-ref>

为什么我执行longin这样的action还是会被拦截呢 我把他们配置在一个struts.xml里面的。。。有个login的action。 怎么才拦截这个呢?  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-08-03 11:26 | 菠萝大象
@gameover
这个excludeMethods表示不拦截welcome与login方法  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2011-08-03 12:56 | gameover
@菠萝大象
这个意思我是明白, 我是这样配置的


<package name="hrms" extends="struts-default">
<interceptors>
<!-- 登录验证拦截器 -->
<interceptor name="authority" class="com.bolo.examples.common.interceptor.AuthorityInterceptor" />
<interceptor-stack name="boloStack">
<!-- 将登录验证拦截器加入默认的拦截器栈中 -->
<interceptor-ref name="authority">
<param name="excludeMethods">welcome,login</param>
</interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="boloStack" />
<global-results>
<result name="login">/jump.jsp</result>
</global-results>
<action name="login" class="com.qieryee.ssi.struts.action.login">
<result name="success">/index.jsp</result>
<result name="input">/login.jsp</result>
</action>
<action name="loginout" class="com.qieryee.ssi.struts.action.login"
method="loginout">
<result name="success">/index.jsp</result>
<result name="input">/login.jsp</result>

我不知道所谓的方法是"method" 还是action 如login.action
我前面就没有像你前面那些声明
如果我除开login.action外所有action都要被拦截器拦截 这个该怎么配置呢?
我这样有什么不对么
</action>   回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2012-06-08 13:35 | 搬个菠萝晒太阳
请问怎么在ssh框架中实现一个简单的页面跳转,这个需不需要拦截器?  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2012-06-08 13:38 | 菠萝大象
@搬个菠萝晒太阳
页面跳转要通过Action来执行转向,拦截器是需要实现某种功能才会用到的  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2013-01-17 16:20 | dohkoos
@gameover

例如:welcome!login.action
这里的excludeMethods里的method指的是login,而不是welcome。

> 如果我除开login.action外所有action都要被拦截器拦截 这个该怎么配置呢?
如果要做到这部的话,就需要从Interceptor或AbstractInterceptor继承,然后去除actionName做判断。  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2013-04-22 15:22 | thankyou
thankyou  回复  更多评论
  
# re: 基于SSH2框架Struts2拦截器的登录验证实现 2016-07-17 15:20 | zombie
感谢  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: