您的位置:首页 > 编程语言 > Java开发

Struts2通过自己定义拦截器实现登录之后跳转到原页面

2016-01-16 15:00 731 查看
这个功能对用户体验来说是非常重要的。实现起来事实上非常easy。

拦截器的代码例如以下:

package go.derek.advice;

import go.derek.entity.User;
import go.derek.util.CommonChecks;
import go.derek.util.Constant;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.StrutsStatics;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class JumpBeforeInterceptor extends AbstractInterceptor implements ApplicationContextAware{

private static final long serialVersionUID = 7224871247223705569L;

@Override
public String intercept(ActionInvocation ai) throws Exception {
ActionContext actionContext = ai.getInvocationContext();
Map<String, Object> session = actionContext.getSession();
User currentUser = (User) session.get(Constant.USER_INFO);
if (null != currentUser
&& CommonChecks.isNotEmpty(currentUser.getUserId())) {
return ai.invoke();//运行下一个拦截器,假设没有拦截器了,就运行action
}
else{
HttpServletRequest request = (HttpServletRequest) actionContext
.get(StrutsStatics.HTTP_REQUEST);
String queryString = request.getQueryString();
// 预防空指针
if (queryString == null) {
queryString = "";
}
// 拼凑得到登陆之前的地址
String realPath = request.getRequestURI() + "?" + queryString;
System.out.println(realPath+"	realPath");
session.put(Constant.GOING_TO_URL, realPath);
return ai.invoke();//放行
}
}

@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
// TODO Auto-generated method stub

}
}
将上一页面的url放到session中,然后登录的时候再从session中取出来,再重定向就能够了。

loginAction中这样写

String url = (String) this.getSession().get(Constant.GOING_TO_URL);
if (CommonChecks.isNotEmpty(url)) {
this.getResponse().sendRedirect(url);
return null;
}


struts.xml配置文件里。要对上面的自己定义拦截器做配置:

<interceptor name="jumpBefore"
class="go.derek.advice.JumpBeforeInterceptor"/>
<interceptor-stack name="jumpTo">
<!-- 定义拦截器栈包括checkLogin拦截器 -->
<interceptor-ref name="jumpBefore"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>


还要在之前的那个页面相应的action中,把拦截器配置上,比方:

<action name="problems" class="problemsAction">
<result>/problems.jsp</result>
<interceptor-ref name="jumpTo" />
</action>


经过上面的过程,就能够实现登陆之后跳转回原页面了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: