今天想实现这个功能,网上说是用 referer 来实现。不过referer也有几个问题:
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;
}
}
分享到:
- 2009-05-12 08:49
- 浏览 3536
- 评论(3)
- 论坛回复 / 浏览 (3 / 8472)
- 查看更多
相关推荐
asp.net登陆自动跳转代码实例 asp.net登陆自动跳转代码实例
主要介绍了Session过期后自动跳转到登录页面实例代码,非常不错具有参考借鉴价值,需要的朋友可以参考下
自己尝试了一下,发现一个问题,当验证登陆成功后,页面会自动跳转到/account/profile,我并不想把页面跳转到这个页面,如何修改呢? 查了一堆网页,还是官网靠谱,很简单,就在project的setting里加一句话就Okay! ...
利用jsp实现登录界面的跳转,数据库采用的是mysql,可以输入账号密码进行登录
只是一个例子。。。 别人没有理解意思,我自己下一个例子给别人看看!!!
主要介绍了JS实现页面超时后自动跳转到登陆页面,需要的朋友可以参考下
为了有更好的用户体验,B登陆成功后应该自动跳转到登陆前的链接。查了PHP帮助手册,利用$_SERVER全局变量可以实现这个功能。 $_SERVER是PHP的一个超全局变量,关于$_SERVER变量的详细解释可以参考:...
老师说要写blog,然后只能把雪藏了多年没动过的博客重新翻出来了,今天先分享下JSP里的倒数计时和自动跳转页面 ... document.getElementById(time)[removed]=i+秒后自动跳转登陆 界面; setTimeout('shownu
其中好友列表界面设计的很详细,有好友头像和消息内容,登录界面设计的非常好看。 打开应用,进入登录界面,用户可以点击注册按钮进入注册界面,输入完账号和密码后,点击注册,自动跳转回登录界面,这时候账号和...
下面一段代码给大家分享php未登录自动跳转到登录页面,具体代码如下所示: <?php namespace Home\Controller; use Think\Controller; class BaseController extends Controller{ //基础信息,判断登陆 public ...
android实现的学科竞赛管理系统包括自动登陆、页面跳转、listview列表信息、上拉加载和下拉刷新、json数据解析等。适合学习使用。
今天小编就为大家分享一篇Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
一个简易而美观的网页登陆注册页面 ...<body class="body_L"> <form action ="login.php" method="POST"/> 用户登录界面</h1> <hr> <table align="center"> <tr> <td class="words" >username</td><td>...
控制台程序如何模拟网页登陆,并且等待网页加载完成做相应处理再获取跳转页面的内容
NiceGUI管理Web开发细节,让您专注于各种应用程序的Python代码,包括机器人、物联网解决方案、智能家居自动...这里是登录页面的实现,包含了主页面的控件布局,文本输入框设置,密码输入框设置,密码验证,页面跳转等。
Android条件判断用户名和密码 登录跳转主页面 记住密码 自动登录
主要介绍了vue-router判断页面未登录自动跳转到登录页的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
但是由于在第一次登录的时候是设置了自动登录,以及保存密码,所以在载入页面完成之后直接跳转到登录页,由于我在登录页设置了如果账号密码正确,自动登录,所以我用Intent让自动登陆后的页面跳转到引导页
自动转向,也叫自动重定向。自动跳转,指当访问用户登陆到某网站时,自动将用户转向其它网页地址的一种技术。转向的网页地址可以是网站内的其它网页,也可以是其它网站。