代码之家  ›  专栏  ›  技术社区  ›  Ram

tomcat中所有struts2应用程序的单点登录

  •  3
  • Ram  · 技术社区  · 12 年前

    我正在使用struts2创建多个应用程序,并将其部署在tomcat7中。所有应用程序的用户都是相同的。所以,我决定只验证一次。为此,我使用cookie。

    不确定这是否是最简单和最好的方法。但仍在尝试。

    然而,我无法为单个应用程序本身实现它。

    登录.jsp

    <s:form action="login">
    <table>
    <tr><s:textfield name="username" placeholder="Username"></s:textfield></tr>
    <tr><s:password name="userpass" placeholder="Password"></s:password></tr>
    <tr>
    <td colspan="2" align="center"><input type="submit" class="button" value="Submit" /></td>
    </tr></table> 
    </s:form>
    

    登录()和注销()

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public String login() {
        int count = 0;
        try {
            Connection con = getConnection();
            PreparedStatement ps = con
                    .prepareStatement("select COUNT(*) AS rowcount from users where username=? and password=? and its='1'");
            ps.setString(1, username);
            ps.setString(2, userpass);
            ResultSet rs = ps.executeQuery();
            rs.next();
            count = rs.getInt("rowcount");
            rs.close();
        } catch (Exception e) {
            System.out.println("Unable to login - " + e.getMessage());
        }
        if (count == 1) {
            Map session = ActionContext.getContext().getSession();
            session.put("login", "true");
            session.put("user", username);
    
            // Save to cookie
              Cookie user = new Cookie("user", username);
              user.setPath("/");
              servletResponse.addCookie(user);
    
            return "success";
        } else {
            setError("Invalid login. Try again.");
            return "error";
        }
    }
    
    @SuppressWarnings("rawtypes")
    public String logout() {
        Map session = ActionContext.getContext().getSession();
        session.remove("login");
        session.remove("user");
        Cookie user = new Cookie("user", "");
          user.setPath("/");
          servletResponse.addCookie(user);
        return "success";
    }
    

    登录检查.jsp

    <%
    String user = null;
    for(Cookie c : request.getCookies()) {
        if (c.getName().equals("user")){
            user = c.getValue();
            }
        }
    if(user == null){
        out.println("user : "+user);
        session.setAttribute("login", "false");
        response.sendRedirect("login.jsp");
        }
    else{
        out.println("user : "+user);
        session.setAttribute("login", "true");
        session.setAttribute("user", user);
        }
    %>
    

    此代码使我正确登录,并设置了cookie,但即使用户未登录,也会显示主页而不是登录页面。

    2 回复  |  直到 12 年前
        1
  •  4
  •   Sumeet Sharma    12 年前

    解决上述问题需要做的事情很少

    1. 设置 cookie.setMaxAge(0) 当您注销时。这将删除cookie 注销时。
    2. 对cookie对象进行空检查。如果存在,则用户为 登录,其他应用程序可以使用该cookie登录 直接使用cookie对象中的用户字符串
        2
  •  3
  •   Ram    12 年前

    感谢@SumeetSharma。工作代码为

    登录()&注销()

    public String login() {
        int count = 0;
        try {
            Connection con = getConnection();
            PreparedStatement ps = con
                    .prepareStatement("select COUNT(*) AS rowcount from users where username=? and password=? and its='1'");
            ps.setString(1, username);
            ps.setString(2, userpass);
            ResultSet rs = ps.executeQuery();
            rs.next();
            count = rs.getInt("rowcount");
            rs.close();
        } catch (Exception e) {
            System.out.println("Unable to login - " + e.getMessage());
        }
        if (count == 1) {
            Map session = ActionContext.getContext().getSession();
            session.put("login", "true");
            session.put("user", username);
            // Save to cookie
              Cookie user = new Cookie("user", username);
              user.setPath("/");
              servletResponse.addCookie(user);
              return "success";
        } else {
            setError("Invalid login. Try again.");
            return "error";
        }
    }
    
    @SuppressWarnings("rawtypes")
    public String logout() {
        Map session = ActionContext.getContext().getSession();
        session.remove("login");
        session.remove("user");
        Cookie user = new Cookie("user", "");
        user.setPath("/");
        user.setMaxAge(0);
          servletResponse.addCookie(user);
        return "success";
    }
    

    登录检查.jsp

    <%@ taglib uri="/struts-tags" prefix="s"%>
    <%@ page language="java"%>
    <%
    for(Cookie c : request.getCookies()) {
        if(c==null){
            session.setAttribute("login", "false");
            }
        else if (c.getName().equals("user")){
            session.setAttribute("login", "true");
            session.setAttribute("user", c.getValue());
            }
        }
    %>
    <s:if test="#session.login != 'true'"> 
    <jsp:forward page="login.jsp" />
    </s:if>