登录后跳转到最后访问URL

lijie250 2009-11-11
现在遇到一个问题,就是实现会员登录后,跳转到最后访问的访问的URL上,大家都是怎么做的?
eimhee 2009-11-12
最后访问的访问的URL放入数据库当中,或COOKIE当中,
lijie250 2009-11-12
eimhee 写道
最后访问的访问的URL放入数据库当中,或COOKIE当中,

放在数据库中这个不可取吧,我是想要具体实现方法,至于放在上面地址我有自己的方法
weibawoaini 2009-11-19
我觉得应该从cookie着手
niuky 2009-12-03
用struts拦截器拦截,在拦截器里判断是否登陆,若没登陆,则将当前地址放到一变量里转发给登陆页面,登陆页面的action接收这个值,然后登陆成功后跳转到这个页面中,或是拦截器中放到session中,不过这样不是太好。。。。
lijie250 2009-12-03
niuky 写道
用struts拦截器拦截,在拦截器里判断是否登陆,若没登陆,则将当前地址放到一变量里转发给登陆页面,登陆页面的action接收这个值,然后登陆成功后跳转到这个页面中,或是拦截器中放到session中,不过这样不是太好。。。。

这些我都知道,我要是具体方法可以获取上一个访问地址?
rentianchou 2009-12-08
放到cookie里
yhailj 2010-01-06
说下我的解决方案

我一直这么觉得的, 一个好的系统, 最初的设计 很重要...

专门建一个 session 类. 需要某个字段就往这个实体里面放, 除此之外,任何地方都不要往 session 里面放东西, 最初的系统开发 Manager 就应该这么设计. 如 :
public class SessionValue {
/**
 * 用户名
 */
private String userName;
... other property
// setter/getter
}


再建一个拦截器 :
/**
 * 检测用户是否登录的拦截器
 * 
 * @author Yh
 */
public class CheckLoginInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 4776361900026731626L;

	/** session 中存放对象的字符串 */
	public String sessionValue;

	/** 跳到全局登录 */
	public static final String LOGIN_PAGE = "global.login";

	/** 登录后的跳转 */
	public static final String URL_REF = "urlRef";

	public String intercept(ActionInvocation actioninvocation) throws Exception {

		/* 检查 session */
		Object obj = actioninvocation.getInvocationContext().getSession().get(sessionValue);
		
		if (obj == null) {
			/* 把前一个页面的页面地址放入 session 中(有可能为空) */
			String url = ServletActionContext.getRequest().getRequestURI();
			/* 使用下面的方法获取的值不准确, 它会获取上一个页面的地址栏. 可以反复测试一下 */
			// String url = ServletActionContext.getRequest().getHeader("referer");
			actioninvocation.getInvocationContext().getSession().put(URL_REF, url);
			return LOGIN_PAGE;
		} else
			return actioninvocation.invoke();
	}

	public void setSessionValue(String sessionValue){
		this.sessionValue = sessionValue;
	}

}


struts.xml :
<!-- 验证登录的拦截器, 其他地方继承 checklogin 即可 -->
<package name="checklogin" extends="struts-default">
	<interceptors>
		<interceptor name="cklogin" class="com.web.common.CheckLoginInterceptor">
			<!-- session 中存放对象的字符串名称. 必须配置. 当然也可以在上面的类里面给一个默认值  -->
			<param name="sessionValue">user</param>
		</interceptor>

		<interceptor-stack name="check">
			<!-- struts 2 的拦截器机制是有先后顺序的 -->
			<interceptor-ref name="cklogin" />
			<interceptor-ref name="defaultStack" />
		</interceptor-stack>

	</interceptors>

	<default-interceptor-ref name="check" />

	<global-results>
		<result name="global.login" type="redirect">login</result>
	</global-results>

</package>
<package name="main" extends="struts-default">
<action name="login">
	<result>/WEB-INF/jsps/commons/login.jsp</result>
</action>
<!-- login.jsp 页面中的登录 -->
<action name="entry" class="commonAction" method="entry">
	<result name="success">
		/WEB-INF/jsps/commons/loginsuccess.jsp
	</result>
	<result name="islogin" type="redirect">${url}</result>
	<result name="input">/WEB-INF/jsps/commons/login.jsp</result>
</action>
</package>

<!-- 下面的代码注意分模块,像这样: -->
<!-- struts 的注解功能 反倒不如配置文件直观 -->
<include file="struts/struts-*.xml" />


struts-login.xml :
<!-- 不需要验证登录的请求都放在这个 package 里面 -->
<package name="login" extends="struts-default" namespace="/login">
</package>

<!-- 需要验证的请求放在这个 package 里面 -->
<package name="login-check" extends="checklogin" namespace="/login">
</package>


CommonAction :
public String entry() {

	/* 处理业务逻辑 */
	UserInfo userinfo = loginService.checklogin(user);
	if (null == userinfo) {
		setMsg("<font color='red'>用户名或密码错误</font>");
		return "input";
	} else
		ActionContext.getContext().getSession().put("user", userinfo);

	// 登录后的跳转页面, 一旦获取到马上将其从 session 中删除
	url = (String)ActionContext.getContext().getSession().get("urlRef");
	ActionContext.getContext().getSession().remove("urlRef");
	// 如果 url 的值为空,则跳到一个默认的地址(如首页个人空间之类的)
	if (isNull(url))
		return "success";

	return "islogin";
}
lijie250 2010-01-06
很详细,谢谢,String url = ServletActionContext.getRequest().getRequestURI(); 
我是用的urlrewrite不知道怎么取到我的美化后的Url
yhailj 2010-01-07
// 此句获取的是浏览器的地址栏. 可以都测试一下
String url = ServletActionContext.getRequest().getHeader("referer");  
Global site tag (gtag.js) - Google Analytics