Struts2实现对action请求对象的拦截操作方法
作者:青之羽
Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。
该方法如下:
public String execute() throws Exception
Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:
public String xxx()
步入正文:
建立一个拦截器对象,当有客户端的请求要访问action对象的时候将会触发当前的拦截器对象,来对当前的请求数据进行过滤操作。
建立一个登录界面用于进行用户名和密码的输入操作,当登录界面当中的表单对象当中的数据提交到action类对象之前,会被拦截器对象进行拦截操作,拦截器对象会从session对象当中进行注册信息的获取操作,通过注册信息registerMessage是否为空来判断当前用户是否有权限对action类对象进行访问操作,如果registerMessage为null,则当前用户必须要先进行用户信息的注册操作,在注册页面当中将registerMessage属性变量添加到session对象当中去然后才能够去进行登录操作,访问action对象。
建立一个拦截器对象用于实现对所有访问action对象的请求数据进行拦截操作。
1:建立一个拦截器对象MyInterceptor该对象继承了抽象拦截器对象类。
2:在建立了拦截器对象之后要想进行使用首先要对该拦截器对象进行注册操作,具体的方式
是在struts.xml当中使用interceptors标签来实现拦截器的注册操作
<interceptors> <interceptor name="MyInterceptor" class="com.interceptots.MyInterceptor"/> </interceptors>
3:要将当前所注册的拦截器对象与指定的action类进行绑定操作,所以用interceptor
标签对象来将其所在的action类与指定的拦截器对象进行绑定操作.
<interceptor-ref name="MyInterceptor"/>
4:注意如果只绑定指定的拦截器对象就会对struts-default.xml对象当中所默认的拦截
器对象进行覆盖操作,在默认的对象当中所绑定的是一个拦截器栈,该栈当中有二十多个拦截器对
象,所以必须要对原来struts-default.xml文件当中的拦截器进行重新绑定操作.
在自定义的拦截器对象当中实现对action对象进行权限拦截操作:
用户要想实现登录来访问action对象,必须要先注册一个registerMessage信息到session对象当中才行,否则在请求访问
action对象的时候,将会被拦截器对象进行拦截操作,发现当前的session会话当中所获取到的注册信息为空时,将会返回到注册失
败的页面当中去.
登录界面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="SystemAction"> <s:textfield name="username" label="用户名"/><br> <s:textfield name="password" label="密码"/><br> <a href="register.jsp" rel="external nofollow" rel="external nofollow" >进行用户的注册</a><br> <a href="destroy.jsp" rel="external nofollow" rel="external nofollow" >进行用户的注销</a><br> 当前用户名:${sessionScope.registerMessage } <br> <input type="submit" value="提交"> </form> </body> </html>
注册界面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册页面</title> </head> <body> <% session.setAttribute("registerMessage","qingzhiyu"); if(session.getAttribute("registerMessage")!=null) { %> <h3>注册成功</h3> <% } %> <a href="login.jsp" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >进行登录</a> ${sessionScope.registerMessage } </body> </html>
action类实例对象:
package com.action; /** * * @author Administrator * */ public class SystemAction { private String username; private String password; /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the password */ public String getPassword() { return password; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } public String execute() { System.out.println("已经进入到了系统action类当中"); return "success"; } }
拦截器对象:
package com.interceptots; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * * @author Administrator *自定义一个拦截器对象,该拦截器对象实现抽象类AbstractInterceptor拦截器对象 */ public class MyInterceptor extends AbstractInterceptor{ /* (non-Javadoc) * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) *对抽象类当中的方法进行重写操作。invocation(请求,调用) */ @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("执行拦截方法"); //从session会话对象当中进行注册信息的获取操作 String registerMessage=(String) ActionContext.getContext().getSession().get("registerMessage"); /*Map session=(Map)invocation.getInvocationContext().getSession(); String registerMessage=(String) session.get("registerMessage");*/ System.out.println("registerMessage="+registerMessage); if(registerMessage!=null) { //表明本次会话当中用户已经进行了信息的注册,所以拥有访问action类对象的权限,所以使用调度对象来调用action //对象当中所指定的方法来实现业务的控制操作 /*类似于过滤器链对象当中的chain方法实现过滤权限的转交操作*/ String result=invocation.invoke(); System.out.println("invocation当中的返回值为:"+result); return result; } else {//表明当前请求访问action对象的用户并没有进行信息的注册所以不具有访问action对象的权限,所以返回失败页面 return "fail"; } } }
拦截器对象要想使用,必须要在配置文件当中进行配置操作之后才会起作用
struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default-package" namespace="/" extends="struts-default"> <!--使用interceptors标签对象来进行一个拦截器对象的注册操作--> <interceptors> <interceptor name="MyInterceptor" class="com.interceptots.MyInterceptor"/> </interceptors> <action name="SystemAction" class="com.action.SystemAction"> <result name="success">/success.jsp</result> <result name="input">/login.jsp</result> <result name="fail">/fail.jsp</result> <interceptor-ref name="MyInterceptor"/> <!--对原有的默认拦截器对象进行绑定操作--> <interceptor-ref name="defaultStack"/> </action> </package> </struts>
登录成功界面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h2>登录成功</h2> 用户名:${username } <br> 密码: ${password } <br> <a href="login.jsp" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >返回登录首页</a> <a href="destroy.jsp" rel="external nofollow" rel="external nofollow" >注销登录</a> </body> </html>
登录失败界面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>权限登录失败界面</title> </head> <body> 您没有进行信息的注册,所以无权进行action对象的访问操作 <a href="register.jsp" rel="external nofollow" rel="external nofollow" >进行用户注册</a> <a href="login.jsp" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >返回登录界面</a> </body> </html>
进行当前用户信息的注销界面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>进行用户信息的注销操作</title> </head> <body> <% session.removeAttribute("registerMessage"); String registerMessage=(String)session.getAttribute("registerMessage"); if(registerMessage==null) { %> 用户信息注销成功 <% } %> <a href="login.jsp" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >login</a> </body> </html>
程序的运行结果:
登录界面
注册界面
登录成功界面:
如果没有进行用户注册直接进行登录操作
总结
以上所述是小编给大家介绍的Struts2实现对action请求对象的拦截操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!