很常见的一个应用就是访问某个页面,因为权限不够,进入登陆页面。人性化的设计是能够在登陆之后,系统跳转到用户原本需要访问的页面。这可以借助拦截器来实现。
在我们验证用户登陆的拦截器里面获取请求地址,并存入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> ... |
嗯,一个小技巧,希望对大家有用。