struts2默认拦截器与自定义拦截器(二)

2014-11-24 01:00:11 · 作者: · 浏览: 7
相当简单,我们通过检查session是否存在键为“ROLE”的字符串,判断用户是否登陆。如果用户已经登陆,将角色放到Action中,调用Action;否则,拦截直接返回Action.LOGIN字段。为了方便将角色放入Action,我定义了接口tutorial.RoleAware,代码如下:

packagetutorial;

publicinterfaceRoleAware {
voidsetRole(String role);
}

接着,创建Action类tutorial.AuthorizatedAccess模拟访问受限资源,它作用就是通过实现RoleAware获取角色,并将其显示到ShowUser.jsp中,代码如下:

packagetutorial;

importcom.opensymphony.xwork2.ActionSupport;

publicclassAuthorizatedAccess extendsActionSupport implementsRoleAware {
privateString role;

publicvoidsetRole(String role) {
this.role =role;
}

publicString getRole() {
returnrole;
}

@Override
publicString execute() {
returnSUCCESS;
}
}

以下是ShowUser.jsp的代码:

<%@ page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s"uri="/struts-tags"%>


Authorizated User


Your role is:



然后,创建tutorial.Roles初始化角色列表,代码如下:

packagetutorial;

importjava.util.Hashtable;
importjava.util.Map;


publicclassRoles {
publicMap getRoles() {
Map roles =newHashtable (2);
roles.put("EMPLOYEE", "Employee");
roles.put("MANAGER", "Manager");
returnroles;
}
}

接下来,新建Login.jsp实例化tutorial.Roles,并将其roles属性赋予 标志,代码如下:

<%@ page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s"uri="/struts-tags"%>


Login


Login


Please select a role below:






创建Action类tutorial.Login将role放到session中,并转到Action类tutorial.AuthorizatedAccess,代码如下:

packagetutorial;

importjava.util.Map;

importorg.apache.struts2.interceptor.SessionAware;

importcom.opensymphony.xwork2.ActionSupport;

publicclassLogin extendsActionSupport implementsSessionAware {
privateString role;
privateMap session;

publicString getRole() {
returnrole;
}

publicvoidsetRole(String role) {
this.role =role;
}

publicvoidsetSession(Map session) {
this.session =session;
}

@Override
publicString execute() {
session.put("ROLE", role);
returnSUCCESS;
}
}

最后,配置struts.xml文件,内容如下:

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">








/Timer.jsp


AuthorizatedAccess



/Login.jsp
/ShowRole.jsp


发布运行应用程序,在浏览器地址栏中输入:http://localhost:8080/AuthorizatedAccess.action。由于此时,session还没有键为“ROLE”的值,所以返回Login.jsp页面。输入用户名和密码后,正常登陆跳转至ShowRole.jsp,大家将会看到将要显示的结果。

\

\

----------------------------

好东西来了。

大家考虑一下,大家做个测试,如果将struts.xml改变一下,在用户登陆时使用默认拦截器拦截一下,结果会怎样?变成如下所示:

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">








/Timer.jsp


AuthorizatedAccess



/Login.jsp
/ShowRole.jsp



结果如下图:

\

这是为什么呢?

原来是拦截器拦截以后,如果你不注入session(比如implements SessionAware),session将会丢失。