您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 工作范文 > struts2学习笔记4
6.使用拦截器实现权限验证为了说明此问题,我们建立struts2auth项目,流程图如下:简短说明:当我们访问main.jsp页面,并试图通过此页面中的链接地址:note.action来访问到.../WEB-INF/note.jsp页面时,由于访问的note.action配置了拦截器,所以会被拦截,如果拦截器判断登录则可以访问,否则会跳到登录页面。如果我们从登录页面直接到main.jsp页面,再来访问note.action时,同样被拦截但是由于登录过,所以可以访问到此action对应的内容。由这里的分析可以看出关键点就登录成功时给出标志提供给拦截器判断是否成功登录。步骤一,搭建好相关的开发环境,并准备好登录页面login.jsp,代码如下:formaction=%=request.getContextPath()%/login.actionmethod=post姓名:inputtype=textname=usernamebr密码:inputtype=passwordname=passwordbrinputtype=submitvalue=登录/form步骤二,建立相应的Action:LoginAction。代码如下:packagecom.asm;publicclassLoginActionextendsActionSupport{privateStringusername;Mapsession;publicStringexecute()throwsException{if(username.equals(admin)){session=ActionContext.getContext().getSession();session.put(loginSign,loginSuccess);returnSUCCESS;}else{returnLOGIN;}main.jsp试图访问:note.actionlogin.jsp.../WEB-INF/note.jsp配置了note.action,并配置了拦截器未登录登录拦截器:判断是否登录由login直接登录到main.jsp}...省略username的get/set方法}说明:我们这里是设定了只有登录用户名为admin时,此Action才设置登录标志。另这里获取Session对象采取的是“与Servlet解耦合的非IOC方式”。步骤三,编写拦截器类,代码如下:packagecom.asm.interceptor;publicclassAuthInterceptorextendsAbstractInterceptor{publicStringintercept(ActionInvocationinvocation)throwsException{Mapsession=invocation.getInvocationContext().getSession();//session=ActionContext.getContext().getSession();if(session.get(loginSign)==null){returnlogin;}else{Stringresult=invocation.invoke();returnresult;}}}步骤四,配置此Action相关,主要配置内容如下:strutspackagename=tokenTestextends=struts-defaultinterceptorsinterceptorname=authclass=com.asm.interceptor.AuthInterceptor/interceptorinterceptor-stackname=authStackinterceptor-refname=auth/interceptor-refinterceptor-refname=defaultStack/interceptor-ref/interceptor-stack/interceptorsactionname=loginclass=com.asm.LoginActionresultname=success/main.jsp/resultresultname=login/login.jsp/result/actionactionname=noteresult/WEB-INF/note.jsp/resultresultname=login/login.jsp/resultinterceptor-refname=authStack/interceptor-ref/action/package/struts说明:结合前面的一些代码来看,当我们为note.action配置了前面写所的AuthInterceptor拦截器时,如果我们要访问note.action,拦截器会首先判断是否登录,如果登录则继续把请求传递下去,如果没有登录则会返回到登录页面。步骤五、编写相关的其它jsp页面,然后发布测试。此实例应重点是进一步掌握拦截器的配置使用。作为“实现资源权限访问”,此实例不具参考价值。7.拦截器中的注解AnnotationWorkflowInterceptor:Invokesanyannotatedmethodsontheaction。意思是此拦截器可以调用在Action中任何有注解的方法。下面我们来演示它的使用,具体步骤如下:步骤一,建立struts2annotationInt项目,并建立LoginAction类,代码如下:packagecom.asm;...省略导入的包publicclassLoginActionextendsActionSupport{privateStringusername;@BeforepublicStringmyBefore(){System.out.println(调用myBefore方法);returnLOGIN;}@AfterpublicvoidmyAfter()throwsInterruptedException{Thread.sleep(5000);System.out.println(----调用myAfter方法);}@BeforeResultpublicvoidmyBeforeResult(){System.out.println(----调用myBeforeResult方法);}publicStringexecute()throwsException{System.out.println(调用execute方法);returnSUCCESS;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){System.out.println(---调用set方法+username);this.username=username;}}说明:要想使用方法成为被拦截器监视的注解方法,只需在方法关加上@...这样的形式并导入相关的类即可。步骤二,编写相关的jsp及配置该Action,主要配置内容如下:strutspackagename=anoextends=struts-defaultinterceptorsinterceptorname=annoclass=com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor/interceptorinterceptor-stackname=annoStackinterceptor-refname=anno/interceptor-refinterceptor-refname=defaultStack/interceptor-ref/interceptor-stack/interceptorsactionname=loginclass=com.asm.LoginActionresultname=success/success.jsp/resultresultname=login/login.jsp/resultinterceptor-refname=annoStack/interceptor-ref/action/package/struts结合配置说明:当我们为LoginAction配置了AnnotationWorkflowInterceptor拦截器时,LoginAction中的所有注解方法才真正生效。下面重点是来讨论这些方法的执行顺序及作用。加@Before注解的方法:willbeinvokedbeforetheactionmethod.Ifthereturnedvalueisnotnull,itisreturnedastheactionresultcode。意思是在action的execute方法执行之前被调用,但是此方法如果返回不为空的话,它的返回结果将是真正的返回结果,比如这里我们returnLOGIN,这样无论以什么用户名登录,它总会返回到loginresult(这里为login.jsp页面)。但是从执前结果来看,在返回前仍执行了标记为@BeforeResult的方法:willbeinvokedaftertheactionmethodbutbeforetheresultexecution。意思是在返回结果集前调用此方法。下面我们把publicStringmyBefore()方法中的returnLOGIN注释掉,并让修改此方法的返回类型为void。随后登录测试(注意要重新部署当前项目),可以发现执行结果如下:调用myBefore方法---调用set方法调用execute方法----调用myBeforeResult方法----调用myAfter方法从执行的顺序来看,标记为@After的方法最后执行,并且可以发现:它会延时5秒执行,但是在延时执行时,浏览器并没有成功跳到success.jsp页面,而是在5秒后,控制台打印出myArter方法中的内容同步跳转到success.jsp页面。@After:willbeinvokedaftertheactionmethodandresultexecution。意为在execute方法执行并且返回结果后此方法被调用。但是从测试来看,标记为@After的方法是会影响到结果的返回(延时返回)。强调:注意方法的执行顺序,相关的内容可以参看AnnotationWorkflowInterceptor类的api文档。8.使用PreResultListener实现回调在进行本实例前请前复习:五.2自定义拦截器。因为PreResultListener对象一般是绑定在拦截器上使用。下面我们新建struts2PreResultListener项目进行测试。步骤一,建立类,实现PreResultListener接口,主要代码如下:packagecom.asm;importcom.opensymphony.xwork2.ActionInvocation;importcom.opensymphony.xwork2.interceptor.PreResultListener;publicclassMyPreResultListenerimplementsPreResultListener{publicvoidbeforeResult(ActionInvocationinvocation,Stringres){//System.out.println(invocation.getAction());//System.out.println(invocation.getResultCode());/*
本文标题:struts2学习笔记4
链接地址:https://www.777doc.com/doc-3264520 .html