`

关于struts2中的拦截器和登陆验证

 
阅读更多

今天给几个热爱JAVA的同学们讲了Struts2的一些知识,重点讨论了其最具价值的拦截器。

<wbr></wbr>

不知道大家还记不记得,在《Struts2之服务器端验证》里我说过这样一句话“在到达Login Action之前,验证已经完成了”。我很希望有人能提出这是为什么,这样我就可以说,这是拦截器的功劳,我们就可以研究拦截器了。<wbr></wbr>

其实,拦截器并不难,也不是十分难懂的东西。在这里再做一些补充.

<wbr></wbr>

打开帮助文档(struts-2.0.6\\docs\\docs\\interceptors.html)的拦截器部分。

<wbr></wbr>

能读懂英文技术文档是程序员必备的基本素质之一,慢慢来吧,只要静下心来逐字逐句的推敲,没有什么理解不了的。实在看不懂,那就看看[Action Lifecyle]这张图吧。Action生命周期,Action被一些拦截器包围着,也就是说在Action执行之前或之后,拦截器会被执行。

<wbr></wbr>

这就是拦截器,把程序看作是一个顺序执行的流,在执行Action的代码之前或之后,拦截器会打断Action的执行,让程序先执行拦截器的代码,这也许就是为什么把它叫做拦截器的原因。有的时候,拦截器还会阻止Action的执行,比如说在验证失败的情况下,应该让程序返回到输入界面让用户重新输入。

<wbr></wbr>

从图上还可以看出,一个Action之外不是只有一个拦截器,那么先执行哪个拦截器呢?Struts2把多个拦截器放在了一个栈中,我们把它叫做拦截器栈。一方面,栈可以解决拦截器的执行顺序问题,另一方面,把相关的拦截器放在一个栈中,管理起来也比较方便。

<wbr></wbr>

Struts2的一个优点是它的可配置性,我们可以根据实际情况选择需要的功能。当然也给我们带来了一些麻烦,就拿拦截器来说吧,要想让拦截器起作用,先要对它进行配置。配置拦截器,需要在struts.xml中加入相关配置:

<package name="default" extends="struts-default">

<wbr><wbr><wbr><wbr> &lt;interceptors&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;interceptor name="timer" class=".."/&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;interceptor name="logger" class=".."/&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;/interceptors&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;action name="login"</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr> class="tutorial.Login"&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="timer"/&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="logger"/&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;result name="input"&gt;login.jsp&lt;/result&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;result name="success"</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> type="redirect-action"&gt;/secure/home&lt;/result&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;/action&gt;</wbr></wbr></wbr></wbr>

</package>

=====================================================================

<interceptors>和</interceptors>标记对表示要配置一些拦截器,里面的每一条是一个拦截器。

<wbr></wbr>

<interceptor name="timer" class=".."/>

interceptor表示这是一个拦截器,name属性是给它起一个名字,class属性是指出它的实现类,也是代码的实际位置。

<wbr></wbr>

拦截器是拦截Action的,当然也要在Action的配置里加入对它的引用,指出这个Action要使用哪个拦截器。

<wbr></wbr>

<interceptor-ref name="timer"/>这句话是告诉Struts框架,login Action需要使用前面的timer拦截器。

<wbr></wbr>

有人也许会说,我们之前并没有配置拦截器,但刚才好像说过,不是也使用到拦截器了么?的确,可能是Struts2的开发者怕配置起来太麻烦了,没有人用吧:P,所以给我预先配置好了一些默认的拦截器和拦截器栈。

<wbr></wbr>

在struts-default.xml(struts-default.xml在struts2-core-2.0.6.jar包中)里面定义了很多拦截器:

<interceptor name="alias" class="com.opensymphony.xwork.interceptor.AliasInterceptor"/>

......

里面的validation和i18n就是我们之前用的验证和国际化功能。

<wbr></wbr>

还有很多拦截器栈:

<!-- Basic stack -->

<interceptor-stack name="basicStack">

<interceptor-ref name="exception"/>

<interceptor-ref name="servlet-config"/>

<interceptor-ref name="prepare"/>

<interceptor-ref name="static-params"/>

<interceptor-ref name="params"/>

<interceptor-ref name="conversionError"/>

</interceptor-stack>

...

<interceptor-stack name="defaultStack">

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="exception"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="alias"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="prepare"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="servlet-config"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="i18n"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="chain"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="model-driven"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="fileUpload"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="static-params"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="params"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="conversionError"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="validation"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="workflow"/&gt;</wbr></wbr></wbr></wbr></wbr>

</interceptor-stack>

<wbr></wbr>

<default-interceptor-ref name="defaultStack"/>

最后这条比较主要,是框架默认使用的拦截器栈,也就是说,defaultStack栈中的拦截器会默认起作用。

<wbr></wbr>

这也是我们没有配置validation和i18n,它们就起作用的原因。

<wbr></wbr>

顺便说一下,拦截器应该属于AOP(面向方面编程)思想的一种实现,它的确给开发带来了很多好处,一方面可以把一个大的问题分解成多个小问题分别处理,另一方面可以使Action专注与处理自己的事情,把相关的功能分散给各个拦截器处理。

<wbr></wbr>

在《Struts2之服务器端验证》中我们详细讨论了关于登陆验证的问题,只有通过登陆验证,拿到令牌的用户才能进入我们的系统。为此我们建立了登陆验证页面和相应的Action类,登陆验证(Login.jsp)负责提供给用户输入帐号和密码的机会,Login Action负责验证用户输入的帐号和密码是否正确,验证通过的情况下把帐号和密码保存到Session中,就相当于用户拿到了一块令牌,就是一个合法用户了。

<wbr></wbr>

我们的目的是限制非法用户,也就是没有拿到令牌的用户,不能访问我们的系统。但是我们只进行了登陆验证和保存令牌的工作,并没有做限制非法用户的工作。现在不守规矩的用户就可以直接在浏览器的地址栏里输入:http://localhost:8080/Success.jsp

访问我们的Success.jsp页面,这当然是不能容忍的。

<wbr></wbr>

在没有学习拦截器之前,我们当然可以在Success.jsp页面里加代码进行限制,先从Session中取出用户名和密码,如果取到了则说明用户已经登陆系统了,否则让浏览器显示Login.jsp让用户登陆系统,这样做一点问题也没有,就相当于我们在每一个房间门口都安排了一个检查令牌的人一样,万无一失。不过,如果系统的受限制资源多起来的时候,比如说像Success.jsp或Action很多,几十个,几百个的时候,这样的代码我们就要写很多遍,这当然也是聪明的我们所不能容忍的:P

<wbr></wbr>

显然,让拦截器来做这项工作再合适不过了。我们可以添加一个拦截器,让它在这些受限制的资源被执行之前先运行,在拦截器里我们检查用户是否登陆了系统,如果登陆了才让他们访问,否则送给用户一个Login.jsp让用户登陆。这样我们的检查代码只需要写一次就一劳永逸了。

<wbr></wbr>

明白了原理之后还需要做几项具体的工作:

1,自己写一个拦截器,实现检查用户是否登陆的功能。

2,添加拦截器的配置,让我们自己写的拦截器起作用。

<wbr></wbr>

首先我们来完成第一个任务,打开:

struts-2.0.6docsdocsguides.html里面的

struts-2.0.6docsdocswriting-interceptors.html帮助。

从这个帮助里我们可以看出,拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。根据经验,init()方法应该是初始化拦截器的方法,可以把一些初始化工作的代码放在它里面,destroy()方法与之相反,在拦截器被销毁之前,让我们有机会执行一些善后工作。

<wbr></wbr>

显然intercept()方法,是添加真正执行拦截工作的代码的地方,如果我们不需要初始化和清理的操作,可以直接继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类,覆盖它的intercept()方法。这个方法有个ActionInvocation类型的参数,可以用它取得Session或转发请求等操作。

<wbr></wbr>

先在src下建立一个包:tutorial.interceptor

在这个包下建立一个类LogonInterceptor继承于AbstractInterceptor,覆盖intercept()方法:

<wbr></wbr>

package tutorial.interceptor;

import java.util.Map;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

<wbr></wbr>

public class LogonInterceptor extends AbstractInterceptor {

<wbr><wbr><wbr><wbr><wbr> public String intercept(ActionInvocation invocation) throws Exception {</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // 取得请求的Action名</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> String<wbr><wbr><wbr> name = invocation.getInvocationContext().getName();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (name.equals("Login")) {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // 如果用户想登录,则使之通过</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return invocation.invoke();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> } else {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // 取得Session。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> ActionContext ac = invocation.getInvocationContext();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Map session =<wbr><wbr><wbr> (Map)ac.get(ServletActionContext.SESSION);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (session == null) {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // 如果Session为空,则让用户登陆。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return "login";</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> } else {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> String username = (String)session.get("username");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (username == null) {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // Session不为空,但Session中没有用户信息,</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // 则让用户登陆</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return "login";</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> } else {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // 用户已经登陆,放行~</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return invocation.invoke();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr>

}

<wbr></wbr>

今天的内容有点多,接下来还要对这个拦截器进行配置:

关于怎样配置一个拦截器使之对所有的Action起作用请参考:

struts-2.0.6docsdocshow-do-we-configure-an-interceptor-to-be-used-with-every-action.html

修改struts.xml,

1,自定义拦截器

2,重定义默认拦截器堆栈

3,添加一个global-results,用户在验证失败的情况下跳转到登陆验证页面

struts.xml的完整内容:

<!DOCTYPE struts PUBLIC

<wbr><wbr><wbr><wbr><wbr> "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</wbr></wbr></wbr></wbr></wbr>

<struts><!-- Configuration for the default package. -->

<constant name="struts.custom.i18n.resources" value="globalMessages" />

<wbr></wbr>

<include file="struts-validation.xml" />

<package name="default" extends="struts-default">

<wbr></wbr>

<wbr><wbr><wbr> &lt;!-- 自定义拦截器 --&gt;</wbr></wbr></wbr>

<wbr><wbr><wbr> &lt;interceptors&gt;</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;interceptor name="logon" class="tutorial.interceptor.LogonInterceptor"/&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;!-- 自定义拦截器堆栈 --&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;interceptor-stack name="myStack"&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="logon"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;!-- 引用默认的拦截器堆栈 --&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr> &lt;interceptor-ref name="defaultStack"/&gt;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;/interceptor-stack&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> &lt;/interceptors&gt;</wbr></wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr> &lt;!-- 重定义默认拦截器堆栈 --&gt;</wbr></wbr></wbr>

<wbr><wbr><wbr> &lt;default-interceptor-ref name="myStack"/&gt;</wbr></wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr> &lt;global-results&gt;</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> &lt;result name="login" type="redirect-action"&gt;Login!input.action&lt;/result&gt;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> &lt;/global-results&gt;</wbr></wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;action name="HelloWorld" class="tutorial.HelloWorld"&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;result&gt;/HelloWorld.jsp&lt;/result&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;/action&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;action name="Login" class="tutorial.Login"&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;result&gt;/Success.jsp&lt;/result&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;result name="input"&gt;/Login.jsp&lt;/result&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;/action&gt;<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

</package>

</struts>

<wbr></wbr>

保存修改并布署项目到Tomcat下,启动Tomcat

在浏览器的地址栏中输入:

http://localhost:8080/tutorial/HelloWorld.action

系统会自动转到Login页面。
分享到:
评论

相关推荐

    使用struts2拦截器对登陆权限验证

    在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...

    Struts2 拦截器 手动验证 或 自动验证 后台登录验证 源码

    在Struts2中,拦截器可以分为手动验证和自动验证两种方式。手动验证通常由开发者编写代码来检查用户是否已登录,如果未登录则重定向到登录页面。而自动验证则是利用Struts2的内置验证框架,根据配置文件自动进行数据...

    struts2拦截器和验证框架(适合初学者-经藏版)

    通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。

    Struts2拦截器及其用法详细说明

    在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...

    struts2中拦截器的使用

    在Struts2中,拦截器的使用主要基于两个方面:配置文件中的声明式使用和注解的编程式使用。首先,我们来看看配置文件中的声明式使用。在struts.xml或类似的配置文件中,你可以通过`&lt;interceptor&gt;`元素定义拦截器,并...

    struts2 拦截器

    2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...

    Struts2学习案例(拦截器)

    在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...

    Struts2拦截器源码

    首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...

    struts2拦截器

    在Struts2中,拦截器(Interceptor)是核心功能之一,用于增强应用的功能和处理业务逻辑。拦截器是基于AOP(面向切面编程)的概念,可以在动作执行前后插入额外的操作,比如日志记录、权限检查、数据验证等。 标题...

    struts2实现拦截器、

    在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它允许开发者在动作执行前后插入自定义逻辑,比如权限检查、日志记录、性能监控等。本文将深入探讨如何使用Struts2实现拦截器,以及如何配置拦截器来实现...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    详解Struts2拦截器

    拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。...

    Struts2 拦截器

    在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的基本概念。拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查...

    struts2拦截器应用小例子

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...

    难经3:Struts2,拦截器拦不住Result?

    拦截器是Struts2中的一个关键概念,它允许开发者在Action执行前后插入自定义的处理逻辑。例如,可以使用拦截器实现登录验证、日志记录、性能监控等功能。拦截器通过链式结构串联起来,形成一个执行栈,每个Action...

    基于ssh拦截器框架Struts2拦截器的登录验证实现

    SSH2 框架中的 Struts2 拦截器功能允许开发者在特定操作执行前或执行后进行自定义处理,例如登录验证、权限检查等。在本文中,我们将探讨如何使用 Struts2 的拦截器来实现登录验证功能。 首先,我们需要了解 Struts...

    Struts2拦截器源程序

    在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...

    Struts拦截器案例——登陆

    总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...

    Struts2 配置登陆拦截器

    在Struts2中,拦截器是实现业务逻辑控制和处理流程的重要组件,它们可以添加额外的功能,如日志记录、权限检查、事务管理等,而不干扰实际的业务操作。本篇文章将详细介绍如何配置Struts2的登录拦截器,以及其背后的...

    Struts2拦截器原理分析

    在Struts2中,拦截器是一个实现了`Interceptor`接口的类,它定义了`intercept()`方法,该方法会在Action执行之前和之后被调用,从而实现对请求的拦截和处理。 ### 二、拦截器栈与配置 Struts2中的拦截器不是单独...

Global site tag (gtag.js) - Google Analytics