`
allwefantasy
  • 浏览: 47208 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

登陆后自动跳转到登录前页面

阅读更多
今天想实现这个功能,网上说是用 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;
		}

	}


分享到:
评论
3 楼 yiding_he 2009-05-14  
是啊,通常都是楼上这样的方式。
2 楼 csliu 2009-05-14  
我看到的一种做法是,在登录的url后面加参数redirect_url=*****,程序中再去取这个参数的值,进行调转。如果为空,在利用refer来做。
1 楼 ranyut 2009-05-13  
考虑不错。
这可以从根本上解决问题,总感觉JS是在耍小聪明 呵呵

相关推荐

    Django框架之登录后自定义跳转页面的实现方法

    自己尝试了一下,发现一个问题,当验证登陆成功后,页面会自动跳转到/account/profile,我并不想把页面跳转到这个页面,如何修改呢? 查了一堆网页,还是官网靠谱,很简单,就在project的setting里加一句话就Okay! ...

    登陆自动跳转页面_demo

    标题“登陆自动跳转页面_demo”涉及到的是一个关于网页登录后自动重定向的示例,这在Web开发中是常见的功能。通常,当用户成功登录后,系统会根据设定自动将用户重定向到特定的页面,例如首页或者用户个人中心。这种...

    asp.net登陆自动跳转代码实例

    这里,`loginUrl`指定了用户未登录时被重定向到的登录页面,`defaultUrl`是用户成功登录后要跳转的页面,`timeout`则设置了会话超时时间。 三、登录处理 在登录页面(如Login.aspx),我们需要编写代码来验证用户...

    QT登陆页面跳转到主界面的源代码

    本主题聚焦于如何在QT环境中,设计一个登录页面并实现从登录界面平滑地跳转到主界面的功能。在QT中,我们可以利用QWidgets或者QtQuick(QML)来构建UI,并通过信号与槽机制来实现各组件间的交互。 首先,我们需要...

    纯jsp登录界面自动跳转

    通过以上步骤,我们可以创建一个简单的JSP登录系统,当用户输入正确的凭证后,系统会自动将其重定向到欢迎页面。然而,这只是一个基础示例,实际的登录系统还需要考虑更多因素,如密码加密、验证码、记住密码、多次...

    TIA博途Wincc-如何实现开机画面等待几秒后,自动跳转到主画面?.docx

    ### TIA博途Wincc-如何实现开机画面等待几秒后,自动跳转到主画面? #### 背景介绍 在工业自动化领域,人机交互界面(HMI)是连接操作人员与控制系统的重要桥梁。TIA博途Wincc作为西门子推出的集成工程软件的一...

    页面自定跳转 超链接 跳转 jsp页面跳转

    具体来说,通过设置`http-equiv`属性为`refresh`,并配合`content`属性,可以设定页面在指定秒数后自动跳转到另一个URL。例如: ```html ; url=http://example.com"&gt; ``` 这段代码表示5秒后,页面将自动跳转至...

    Session过期后自动跳转到登录页面的实例代码

    以上代码片段展示了如何通过过滤器实现Session过期后的自动跳转。这种方式更加灵活,可以直接控制HTTP响应,确保用户在Session过期后能够被正确地引导回登录页面,重新验证其身份。在实际应用中,还需要考虑其他因素...

    实现注册登陆的简单页面设计以及页面跳转

    文本视图则用于展示静态文本,如登录页面的标题或提示信息。"EditText"则是用户输入数据的地方,如用户名和密码字段。 "注册登陆"流程涉及用户信息的收集和验证。在注册过程中,用户需要提供有效的用户名和密码,...

    JSP源码,登陆后自动跳转。

    在这个名为"JSP源码,登陆后自动跳转"的项目中,我们主要关注的是用户登录验证成功后自动重定向到特定页面的功能,这通常涉及到几个关键的JSP和Web开发概念。 1. **登录表单**:在网页上,用户会看到一个用于输入...

    c# winfrom 登陆跳转主窗体

    在C# WinForm应用开发中,创建一个登录界面并实现登录成功后跳转到主窗体的功能是一项常见的任务。下面将详细解释这个过程中的关键知识点。 1. **WinForm基本结构**:WinForm是.NET Framework提供的一种用于创建...

    JS实现页面超时后自动跳转到登陆页面

    JS代码: 代码如下: [removed]  var myTime = setTimeout(“Timeout()”, 60000);  function resetTime() {  ...“您的登录已超时, 请点确定后重新登录!”&#41;;   [removed].href=’login.jsp

    帆软实现IP+端口登陆,首页跳转方式

    帆软实现IP+端口登陆,首页跳转方式。..\Tomcat 8.0\webapps\ROOT 下增加一个 ... ...输入192.168.176.18:8080 (你要快速登陆的地址)使得 tomcat 首页跳转到http://192.168.176.18:8080/WebReport/ReportServer?op=fs

    天眼查数据抓取 自动登陆 跳转抓取 翻页 写入数据库.zip

    自动登陆 跳转抓取 翻页 写入数据库.zip”的压缩包文件包含了一个C#编程语言相关的项目,目标是自动登录天眼查网站,抓取相关数据,处理页面跳转,实现翻页功能,并将抓取的数据存储到数据库中。以下是对这个项目中...

    PHP未登录自动跳转到登录页面

    下面一段代码给大家分享php未登录自动跳转到登录页面,具体代码如下所示: &lt;?php namespace Home\Controller; use Think\Controller; class BaseController extends Controller{ //基础信息,判断登陆 public ...

    JSP中的倒数计时和自动跳转页面

    老师说要写blog,然后只能把雪藏了多年没动过的博客重新翻出来了,今天先分享下JSP里的倒数计时和自动跳转页面 ... document.getElementById(time)[removed]=i+秒后自动跳转登陆 界面; setTimeout('shownu

    Java Web实现session过期后自动跳转到登陆页功能【基于过滤器】

    Java Web实现session过期后自动跳转到登陆页功能【基于过滤器】 本文主要介绍了Java Web实现session过期后自动跳转到登陆页功能,涉及java过滤器针对session的判断与跳转相关操作技巧。 一、建立基本过滤器 要...

    RouterOS 网页首次登陆跳转

    RouterOS 网页首次登陆跳转 根据网上的一些自动跳转网页的帖子,进行测试和分析后总结以下经验,大至原理如下

    Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法

    这样,当用户访问登录页面时,系统就能自动跳转到他们应有的页面,而不是停留在登录页面上。 最后,这个自动跳转的功能对于保证应用的安全性非常关键,因为任何没有正确处理的访问尝试都可能会导致安全漏洞。因此,...

Global site tag (gtag.js) - Google Analytics