很常见的一个应用就是访问某个页面,因为权限不够,进入登陆页面。人性化的设计是能够在登陆之后,系统跳转到用户原本需要访问的页面。这可以借助拦截器来实现。
在我们验证用户登陆的拦截器里面获取请求地址,并存入session。
package
com.tuanplus.interceptor;
import
java.util.Map;
import
javax.servlet.http.HttpServletRequest;
import
org.apache.struts2.ServletActionContext;
import
com.opensymphony.xwork2.ActionContext;
import
com.opensymphony.xwork2.ActionInvocation;
import
com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 验证用户登陆
*
* @author MZULE
*
*/
public
class
UserLoginInterceptor
implements
Interceptor {
private
static
final
long
serialVersionUID = 1593745236481514166L;
public
void
destroy() {
}
public
void
init() {
}
public
String intercept(ActionInvocation invocation)
throws
Exception {
ActionContext context = invocation.getInvocationContext();
// 获取session
Map<String, Object> session = context.getSession();
Object user = session.get(
"user"
);
// 用户还未登陆
if
(user ==
null
) {
// 获取HttpServletRequest对象
HttpServletRequest req = ServletActionContext.getRequest();
// 获取此请求的地址,请求地址包含application name,进行subString操作,去除application name
String path = req.getRequestURI().substring(
10
);
// 获得请求中的参数
String queryString = req.getQueryString();
// 预防空指针
if
(queryString ==
null
) {
queryString =
""
;
}
// 拼凑得到登陆之前的地址
String realPath = path +
"?"
+ queryString;
// 存入session,方便调用
session.put(
"prePage"
, realPath);
return
"login"
;
}
// 用户已经登陆,放行
return
invocation.invoke();
}
}
|
在用户登陆的action中加入字符串类型的prePage属性,用来存储拦截器放入session的prePage值(即登陆前的请求地址)。
package
com.tuanplus.action;
import
com.tuanplus.po.User;
import
com.tuanplus.service.IUserService;
import
com.tuanplus.util.AuthCodeUtil;
/**
* 登陆Action
*
* @author MZULE
*
*/
public
class
LoginAction
extends
BaseAction {
private
static
final
long
serialVersionUID = -6179170126070438432L;
private
IUserService userService;
private
User user;
//验证码
private
String auth;
//登录前页面
private
String prePage;
public
String execute() {
// 获取登陆的User对象
User seuser = userService.get(user.getEmail());
// 加入session
session.put(
"user"
, seuser);
//获取跳转到登陆界面之前的页面地址,由拦截器提供
prePage = (String) session.get(
"prePage"
);
//清除session中的数据
session.remove(
"prePage"
);
if
(prePage ==
null
) {
//不是拦截器跳转到登陆页面的,直接访问的登陆页面
return
"myorder"
;
}
else
{
return
SUCCESS;
}
}
...
}
|
在struts.xml中配置使用action的属性prePage决定物理视图资源。
...
<!-- 登陆 -->
<action name=
"login"
class
=
"loginAction"
>
<result type=
"redirectAction"
>${prePage}</result>
<result name=
"myorder"
type=
"redirectAction"
>myOrder</result>
<result name=
"input"
>/login.jsp</result>
</action>
...
|
嗯,一个小技巧,希望对大家有用。