java web开发的时候,单点登录和权限控制到底是如何实现的?

问题描述

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台机器上同时登录系统,同时使用系统

时间: 2024-09-12 23:45:01

java web开发的时候,单点登录和权限控制到底是如何实现的?的相关文章

Java Web开发防止多用户重复登录的完美解决方案_java

目前web项目中,很多情况都是可以让同一个账户信息在不同的登录入口登录这次,这样子就不那么美好了. 推荐阅读: Java 多用户登录限制的实现方法 现在有两种解决方案: 1.将用户的登录信息用一个标志位的字段保存起来,每次登录成功就标记1,注销登录就标记为0,当标记为1的时候不允许别人登录. 2.将用户的登录信息保存在application内置作用域内, 然后利用session监听器监听每一个登录用户的登录情况. 很显然,第一种方式 每次登录 都需要操作数据库,多了一些不必要的性能开销,而且在登

Tomcat与Java Web开发技术详解连载之二

web|详解 2.2.4 部署HTML文件 在helloapp目录下加入index.htm文件,这个文件仅仅用来显示一串带链接的字符"Welcome to HelloApp", 它链接到login.jsp文件.以下是index.htm文件的代码: <html><head><title>helloapp</title></head><body ><p><font size="7"

初学者的忧伤-java/web开发同一账户同一时间只能登陆一次

问题描述 java/web开发同一账户同一时间只能登陆一次 我们的项目需要实现一个用户只在同一时间只能有一个登陆,后面人如果登陆则提示他已经此用户已经登陆,保证第一个人登陆不掉线,谁会写啊,最好有可用的源码,谢谢了! 解决方案 一般都是后面的踢掉前面的.你的设计有致命的问题就是,如果你的前一个用户掉线了,或者突然关机了. 那么他再登录算新用户了吧(可能ip变化了),那么系统还得保证那个根本不存在的用户在线,而不让登录,岂不是这个用户永远登录不了了. 解决方案二: 当然你非要这么写也不是不可以,很

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Sp

本文为原创,如需转载,请注明作者和出处,谢谢! 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23   图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.对 AJ

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Spring+Ajax (附源代码)

本文为原创,如需转载,请注明作者和出处,谢谢! 源代码下载 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23 图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.

Java Web开发模式

一 Java Web开发模式的变迁 1 最初的Java web服务器端编程技术是Servlet,利用Servlet就可以开发出一个Web应用程序. 2 为了解决Servlet缺陷,SUN推出了JSP技术.但是开发人员又走向了另一个极端就是完全放弃了Servlet.   在JSP页面混合使用HTML标记和java代码编写的脚本元素标记来开发Web程序.采用这种方法虽然可以编写JSP页面变得简单,直观,然而,他只适合于业务流程简单,系统规模较小的应用系统.   如果系统较大的话,就会出现两个严重的缺

Tomcat与Java Web开发技术详解连载之一

web|详解 本章介绍如何在Tomcat上创建和发布Web应用.这里首先讲解Tomcat的目录结构以及Web应用的目录结构,接着介绍如何将HTML.Servlet.JSP和Tag Library部署到Web应用中,然后介绍把整个Web应用打包并发布的方法,最后介绍如何在Tomcat上配置虚拟主机. 本章侧重于讨论Web应用的结构和发布方法,所以没有对本章的Servlet和JSP的例子进行详细解释,关于Servlet和JSP的技术可以分别参考其它章节的内容. 2.1 Tomcat的目录结构 在To

Tomcat与Java Web开发技术详解连载之三

web|详解 2.2.8 创建并发布WAR文件 Tomcat既可以运行采用开放式目录结构的Web应用,也可以运行WAR文件.在本书配套光盘的sourcecode/chapter2/helloapp目录下提供了所有源文件,只要把整个helloapp目录拷贝到/webapps目录下,即可运行开放式目录结构的helloapp应用.在Web应用的开发阶段,为了便于调试,通常采用开放式的目录结构来发布Web应用,这样可以方便地更新或替换文件.如果开发完毕,进入产品发布阶段,应该将整个Web应用打包为WAR

用Stripes做Java Web开发

摘要:Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架.本文将介绍Stripes与其它如Struts之类基于动作的框架的区别和其提供的一些存在于Ruby on Rails之中的简单性. Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架.传统的Java web开发着眼于借去耦(Decoupling)来实现其灵活性,但导致多个的配置文件,额外的对象,和其他资源的分散.这些困难造成相当多的程序员的更