问题描述
3个疑问,除了用filtercookie有什么其它实现?google的一下可以用spring3的springsecurity单点登录有耶鲁大学的开源项目cas但是都没有什么好的,容易懂的例子可以学习1,未登录时不能登录比如访问main.jsp时提示登录跳回登录页面2,登录以后再次登录同样的用户被拒绝3,登录后能直接访问main.jsp求实例谢谢
解决方案
解决方案二:
先顶啊
解决方案三:
引用楼主jfqxll的回复:
2,登录以后再次登录同样的用户被拒绝
这个有问题,如果用户user先登录,然后直接关闭浏览器(例如客户端系统死机),那么user在session失效之间无论如何都不能再次登录系统了。应该设计为这样。后面登录的用户踢掉前面的登录的用户。QQ就设计为这样:你的QQ号码在其他地方登录,你被迫下线。
解决方案四:
引用楼主jfqxll的回复:
除了用filtercookie有什么其它实现?
我觉得没有什么方法比filter好。struts2有intercepter的概念,不过这个从本质上来说,和filter一个原理
解决方案五:
关注回复内容太短了!回复内容太短了!回复内容太短了!
解决方案六:
引用3楼araychou的回复:
引用楼主jfqxll的回复:除了用filtercookie有什么其它实现?我觉得没有什么方法比filter好。struts2有intercepter的概念,不过这个从本质上来说,和filter一个原理
如何保证cookie的安全以及时效性?我该往cookie里记录什么信息?记录信息后如何保证不被破解?
解决方案七:
引用5楼jfqxll的回复:
引用3楼araychou的回复:引用楼主jfqxll的回复:除了用filtercookie有什么其它实现?我觉得没有什么方法比filter好。struts2有intercepter的概念,不过这个从本质上来说,和filter一个原理如何保证cookie的安全以及时效性?我该往cookie里记录什么信息?记录信息后如何保证不被破解?……
其实,我的回复里没有cookie。我认为,cookie是不能用来作单点登录限制的。cookie肯定可以被用户修改,所以,cookie不能用来作单点登录的验证。如果非要说cookie有用,她的唯一作用就是得到session需要cookie。(不是必须)
解决方案八:
ArayChou能给个例子吗?我学习学习
解决方案九:
将你用户用session保存起来,当访问那个页面时,就在那个页面去验证session,判断。如果没有用户或者已有了当前用户,跳转到登录页面
解决方案十:
权限控制用过滤器就可以了。关于单点登录,一种如楼上所述采用后上线者顶掉前面登录的用户。其他的参考:
解决方案十一:
像sessioncookie多数浏览器+服务器都是用内存型的cookie,也就是不会写到碰盘的而是保持在内存里。这样比写碰盘的要好点儿。
解决方案十二:
可以从用sessionid确定唯一会话方面考虑
解决方案十三:
用户验证可以用session,数据监控可以用filter。
解决方案十四:
cookie只是用来存放一些明文数据在客户端的,session是服务端的,cookie唯一的作用就是持有状态而已,自动登陆需要cookie,至于session么,我觉得是没什么好说的,就是filter做延迟登陆单点的问题就是后登陆顶下先登陆的
解决方案十五:
引用楼主jfqxll的回复:
1,未登录时不能登录比如访问main.jsp时提示登录跳回登录页面
这个可以使用springsecurity来进行配置,可以参考下family168里面写的权限管理手册里面的http配置引用楼主jfqxll的回复:
2,登录以后再次登录同样的用户被拒绝
这个可以用springsecurity配置下<concurrent-session-controlexception-if-maximum-exceeded="true"/>具体配置可以查看springsecurity的官方文档
解决方案:
单点登陆,是esb总线集成的内容,不知道楼主的具体用意.说一下我实现的想法,用户通过门户进去,在门户上拿到一个token令牌,然后根据这个值,去用户池里拿到用户,密码,然后就可以登陆到各自系统.权限一般在门户不做设置,由各系统自己完成.
解决方案:
引用7楼jfqxll的回复:
ArayChou能给个例子吗?我学习学习
我话30来分钟写了个大概,没有测试,应该可以看出原理了/***@authorArayChou*Email:Aray(dot)Chou(dot)CN(at)gmail(dot)com*Replace"(dot)"with"."andreplace"(at)"with"@"*/packagecom.aray.core.filter;importjava.io.IOException;importjava.util.HashMap;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;/***用户登录<br/>*验证用户明密码,如果正确,让他访问/index.htm。同时将用户名存入session.*用户登录成功,找到以前登录的同名用户的session,标记它为用户未登录。*/publicclassLoginextendsHttpServlet{/**TODOaddcomments*/privatestaticfinallongserialVersionUID=-1503457404159800655L;/**存放所有已登录的session,key为用户名*/staticfinalHashMap<String,HttpSession>ALL_SESSION=newHashMap<String,HttpSession>();/**(non-Javadoc)**@seejavax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,*javax.servlet.http.HttpServletResponse)*/@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{exec(req,resp);}/***用户登录,验证用户明密码,如果正确,让他访问/index.htm。同时将用户名存入session.*用户登录成功,找到以前登录的同名用户的session,标记它为用户未登录。**@paramreq*@paramresp*/privatevoidexec(HttpServletRequestreq,HttpServletResponseresp){Stringuser=req.getParameter("user");Stringpassword=req.getParameter("password");if(password!=null&&password.equals("ILoveAray")){//用户密码验证成功,登录HttpSessionsession=req.getSession(true);session.setAttribute("user",user);//将登录信息放入ALL_SESSIONHttpSessionexsistsSession=ALL_SESSION.put(user,session);if(exsistsSession!=null)//以前登录的同名用户的session{//标记用户登录失效exsistsSession.removeAttribute("user");//标记此用户被banexsistsSession.setAttribute("banned",true);};//访问首页try{resp.sendRedirect("/index.htm");}catch(IOExceptione){e.printStackTrace();}}else{//用户密码验证失败}}/**(non-Javadoc)**@seejavax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,*javax.servlet.http.HttpServletResponse)*/@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{exec(req,resp);}}
/***@authorArayChou*Email:Aray(dot)Chou(dot)CN(at)gmail(dot)com*Replace"(dot)"with"."andreplace"(at)"with"@"*/packagecom.aray.core.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;/***检查用户登录状态。<br>*如果用户未登录,检查它是否被踢,如果被踢,告诉他“你当前使用的用户名在其它地方登录,你被迫下线”<br>*如果用户为登录,且不是被踢,调到登录页面*/publicclassRequestFilterimplementsFilter{/**(non-Javadoc)**@seejavax.servlet.Filter#doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,*javax.servlet.FilterChain)*/@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseresp=(HttpServletResponse)response;//登录页面可以直接访问,不用检查登录状态if(req.getRequestURI().startsWith("/login.do"))chain.doFilter(req,resp);HttpSessionsession=req.getSession(true);Objectuser=(session.getAttribute("user"));if(user==null){Objectbanned=session.getAttribute("banned");if(Boolean.TRUE.equals(banned)){//用户被踢,告知用户被踢信息response.getWriter().print("你当前使用的用户名在其它地方登录,你被迫下线");return;}else{//用户未登录resp.sendRedirect("/login.do");}}chain.doFilter(req,resp);}@Overridepublicvoiddestroy(){}@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}}
解决方案:
引用15楼zhanghua4109的回复:
单点登陆,是esb总线集成的内容,不知道楼主的具体用意.说一下我实现的想法,用户通过门户进去,在门户上拿到一个token令牌,然后根据这个值,去用户池里拿到用户,密码,然后就可以登陆到各自系统.权限一般在门户不做设置,由各系统自己完成.
你说的意思是:登录了A系统,不用再次登录,即可用A系统登录的身份访问B系统。楼主说的意思是:一个用户名,不能在2台机器上同时登录系统,同时使用系统