2

假设一个人在应用程序中使用用户 ID 和密码登录。现在,他使用相同的用户 ID 和密码尝试登录而不从第一个会话中退出。我想让它从第一个会话中注销并自动继续新的会话。

Struts2、JSP、Java 是技术,我用于我的应用程序。

面临的问题

  1. 如果我们在新选项卡或窗口中打开,IE 8 会在同一台机器上提供相同的会话 ID。无法区分来自同一台机器的不同登录。如何设置自己的会话ID?
  2. 像 SBI 网站这样的银行应用程序都只能这样工作,它是如何实时工作的?
  3. 我想复制与 SBI 银行网站在在线交易上工作相同的东西。如果您在新窗口中再次打开,则在第一个窗口中发送消息会话

请让我知道此日志记录的详细信息。谢谢。

这是我的过滤器

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    System.out.println("FirstFilter : In filter doFilter before doFilter...");
    HttpServletRequest req = (HttpServletRequest) request ;
    HttpServletResponse res = (HttpServletResponse) response ;

    HttpSession session = req.getSession(false);

    String userId=req.getParameter("username");
    String password=req.getParameter("password");
    System.out.println(" : : " + req.getParameter("username")) ;
    System.out.println(" : " + req.getServletPath());


    LoggedInUserVO userProfVOSession = null ;
    if(session != null) {
    String  sessionId=session.getId();
        userProfVOSession = (LoggedInUserVO)session.getAttribute("LoggedInUser") ;
        //check for login id password and session for single user sign in
        if(null!=userProfVOSession){
        if(userProfVOSession.getUserName().equalsIgnoreCase(userId) && userProfVOSession.getUserPassword().equals(password) && userProfVOSession.getSessionId().equals(sessionId)){
            //do nothing
        }
        else{
            System.out.println("in duplicate");
        }
        }
    }       

    if(userProfVOSession == null) {
        if("/populatelogin.action".equals(req.getServletPath()) || "/login.action".equals(req.getServletPath())||"/images/Twalk-Logo-4-green.png".equals (req.getServletPath())||"css/twalk.css".equals( req.getServletPath() )) {
            chain.doFilter(req, res) ;
        } else {
            req.getRequestDispatcher("Entryindex.jsp").forward(req, res) ;
        }
    } else {
        chain.doFilter(req, res) ;
    }
4

1 回答 1

1

基本上你的要求会导致网络安全漏洞。如果一个人已经登录,那么他的会话必须是活动的。现在场景是这样的:

如果您尝试使用相同的凭据再次登录,他将自动登录。如果您想在每次登录时终止旧会话,那么您需要做的是,每次登录时都需要获取一个新会话,因此您的旧会话将过期。您只需编写一个过滤器即可实现此目的。在此过滤器中检查用户是否已与会话关联,如果是,则使他的当前会话无效并开始新会话。这将解决多次登录尝试的问题。

请记住,当会话启动时,服务器会将 cookie 发送回用户。从今以后,对于每个后续请求,此 cookie 将被传输到服务器。即使您在浏览器中打开多个选项卡,也只会将相同的 cookie 发送回服务器。

希望我明白这一点。

于 2012-04-13T05:30:55.617 回答