浏览 8500 次
锁定老帖子 主题:登陆后自动跳转到登录前页面
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-12
最后修改:2009-05-12
1 当打开一个新窗口 直接输入网址 浏览器似乎不会发送referer 头 2 当通过js window.open等函数打开也不回产生 3 referer 发送与否 在浏览器是可设置的(当然估计也没多少人会去设置) 这里我结合struts2 说下我的实现方法: package com.snail.commons.interceptors; import java.util.Enumeration; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.aopalliance.intercept.Invocation; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsStatics; import org.hibernate.criterion.Expression; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.snail.commons.basedao.IBaseDAO; import com.snail.component.beans.Huiyuan; @Scope("prototype") @Controller("loginInter") public class LoginInter extends AbstractInterceptor { private final static Logger logger=Logger.getLogger(LoginInter.class); public final static String SESSION_KEY="User"; public final static String COOKIE_KEY="12cd"; public final static String GOTO_URL_KEY="GOING_TO"; @Resource(name="baseDAO") protected IBaseDAO baseDAO; @Override public String intercept(ActionInvocation invocation) throws Exception { HttpServletRequest request=ServletActionContext.getRequest(); HttpServletResponse response=ServletActionContext.getResponse(); HttpSession session=request.getSession(); //通过session 判断用户是否登录,没有则继续读取cookie if(session!=null&&session.getAttribute(SESSION_KEY)!=null) { return invocation.invoke(); } Cookie[] cookies=request.getCookies(); if(cookies!=null&&cookies.length!=0) { for(Cookie cookie:cookies) { if(COOKIE_KEY.equals(cookie.getName())) { String value=cookie.getValue(); if(StringUtils.isNotBlank(value)) { List<Huiyuan> huiyuans=baseDAO.findEntityProperty(Huiyuan.class, Expression.eq("yongHuMing", value)); if(huiyuans.size()==0) { cookie.setPath("/"); cookie.setValue(null); cookie.setMaxAge(0); response.addCookie(cookie); return "index"; } if(huiyuans.get(0)!=null) { session.setAttribute(SESSION_KEY, huiyuans.get(0)); logger.info("读取cookie:继续"); return invocation.invoke(); } } } } } //这里是关键点了 设置客户原来请求的url地址 setToGoingURL(request,session, invocation); return "index"; } private void setToGoingURL(HttpServletRequest request,HttpSession session,ActionInvocation invocation) { //如果referer不为空 直接使用它。如果为空我们分别获得命名空间,action名,以及请求参数 //从新构造成一个URL保存在session中 String url=request.getHeader("referer"); logger.info("待转向URL:"+request.getHeader("referer")); if(url==null||url.equals("")) { url=""; String path=request.getContextPath(); String actionName=invocation.getProxy().getActionName(); String nameSpace=invocation.getProxy().getNamespace(); if(StringUtils.isNotEmpty(nameSpace)) { url=url+path+nameSpace; } if(StringUtils.isNotEmpty(actionName)) { url=url+"/"+actionName+".action"+"?"; } Map<String,String[]> zzMap=request.getParameterMap(); if(zzMap!=null) { for(String s:zzMap.keySet()) { String[] value=zzMap.get(s); for(String val:value) { url=url+s+"="+val+"&"; } } } logger.info("完整URL:"+url); } session.setAttribute(GOTO_URL_KEY, url); } public void setBaseDAO(IBaseDAO baseDAO) { this.baseDAO = baseDAO; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-13
考虑不错。
这可以从根本上解决问题,总感觉JS是在耍小聪明 呵呵 |
|
返回顶楼 | |
发表时间:2009-05-14
我看到的一种做法是,在登录的url后面加参数redirect_url=*****,程序中再去取这个参数的值,进行调转。如果为空,在利用refer来做。
|
|
返回顶楼 | |
发表时间:2009-05-14
是啊,通常都是楼上这样的方式。
|
|
返回顶楼 | |