Spring MVC:登录和注销功能?

Posted

技术标签:

【中文标题】Spring MVC:登录和注销功能?【英文标题】:Spring MVC: Login and logout functions? 【发布时间】:2015-10-29 00:04:55 【问题描述】:

我是 Spring MVC 的新手,需要有关登录/注销功能的帮助。我已经弄清楚了登录部分(我认为),但仍在努力使用注销功能。我是否需要建立会话才能注销用户?

控制器 Java 文件

@RequestMapping(value = "/Login.do")
public String Login(@ModelAttribute("searchVO") UserInfoVO searchVO, ModelMap model, HttpServletRequest request) throws Exception 

    int check = sampleService.loginSample(searchVO);

    String username = request.getParameter("registerUsername");
    String password = request.getParameter("registerPassword");

    if(check>0&&searchVO.getRegisterUsername()!=null)
        return "forward:/Menu.do";
    

    else
        return "sample/Login";
    
   

登录 XML 文件

<select id="leagueDAO.loginSample" parameterClass="userinfoVO" resultClass="int">

        SELECT COUNT(*) totcnt
        FROM REGISTER
        WHERE 1=1   
        AND REGISTERUSERNAME =  #registerUsername# 
        AND REGISTERPASSWORD = #registerPassword#

</select>

登录 JSP 页面

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c"      uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form"   uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui"     uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link type="text/css" rel="stylesheet" href="<c:url value='/css/egovframework/sample.css'/>"/>

    <script type="text/javascript" language="javascript" defer="defer">

    function doLogin()
            document.listForm.action = "<c:url value='/Login.do?'/>";
        

    function doRegisterPage()
        document.listForm.action = "<c:url value='/Register.do?'/>";

        

    </script>

</head>
<br/>
<br/>
<br/>
<br/>
    <body style="font-family:Arial; text-align: center; font-size:16px; margin-left:330px;">
        <form:form commandName="loginForm" id="listForm" name="listForm" method="post">
                <h1 style="padding-top: 40px; margin-bottom:-10px; width:280px; height:300px; text-align:center; font-family:Mistral; font-size:56px; color:#000000; margin-top: 50px; margin-left:330px;">Welcome!

                <br/>
                <input id="registerUsername" onKeydown="Javascript: if (event.keyCode==13) javascript:doLogin();" align="middle" name="registerUsername" style="border: 5px padding: 8px 0px 0px 2px; margin-top:10px; width:200px; height:30px; font-family:Arial; font-size:18px;" type="text"></input>
                <input id="registerPassword" onKeydown="Javascript: if (event.keyCode==13) javascript:doLogin();" align="middle" name="registerPassword" style="border: 5px padding: 8px 0px 0px 2px; margin-top:10px; width:200px; height:30px; font-family:Arial; font-size:18px;" type="password"><br/></input>

                <button onclick="javascript:doLogin()" style="cursor:pointer; margin-top:20px; width:208px; height:40px; font-family:Arial; font-size: 16px; color: #FFFFFF; background-color: #32CD32;">Sign In</button><br/>
                <br/>
                <button onclick="javascript:doRegisterPage()" style="cursor:pointer; margin-bottom:30px;width:208px; height:40px; font-family:Arial; font-size: 16px; color: #FFFFFF; background-color: #0000CD;">Create Account</button><br/>
        </form:form>
    </body>
</html>

编辑:

添加时出现错误提示

HttpSession session = request.getSession();
session.invalidate();

org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet action threw exception
java.lang.***Error
at javax.servlet.ServletRequestWrapper.getRemoteAddr(ServletRequestWrapper.java:260)

【问题讨论】:

【参考方案1】:

类似于登录方法,您可以在控制器中创建一个方法来获取会话并使其无效。当用户点击注销时调用此方法。 HttpSession 会话 = request.getSession(); session.invalidate();

【讨论】:

我收到此错误消息:org.apache.catalina.core.ApplicationDispatcher 调用 / Servlet.service() 用于 servlet 操作抛出异常 / java.lang.***Error 提供整个堆栈跟踪和导致此错误的代码。【参考方案2】:

在这里,您没有在登录时创建任何会话。您只是重定向页面。 参考此创建登录和注销:http://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/jc.html

【讨论】:

【参考方案3】:

您正在使用 Spring MVC,并且您似乎正在尝试实现自己的登录和注销功能。相反,我建议使用 Spring Security 来处理身份验证。

在 pom.xml 中,将这些添加到依赖项部分

    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-core</artifactId>
      <version>$spring.security.version</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
      <version>$spring.security.version</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
      <version>$spring.security.version</version>
    </dependency>

然后,您可以使用硬编码用户 (auth.inMemoryAuthentication())、数据库 (auth.jdbcAuthentication()) 以及 LDAP 等其他方法轻松配置身份验证。

创建您自己的身份验证功能会带来很大的安全风险,而且我发现它会适得其反,因为您基本上是在尝试重新发明***。对于学术或学习目的,尤其是在信息安全方面,这肯定是一个很好的练习。但是,如果您的目标是对 Spring 作为一个整体有很好的了解,那么也要学习 Spring-Security。

【讨论】:

如何进行身份验证?抱歉,我完全是编程新手。 不使用spring boot,但我使用的是Maven。 您需要做的是设置 maven 依赖项,为 Spring Security 创建配置(在 dispatcher-servlet.xml 或侦听器中配置的其他 xml 中),决定您的用户身份验证方法(在内存中, jdbc、ldap 等),并创建您的 login.html 或 login.jsp,然后将它们全部绑定到控制器中。

以上是关于Spring MVC:登录和注销功能?的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC (Hibernate+Maven) - 多个控制器和会话(登录/注销)

Spring MVC 上的 JWT 注销

Spring Security 注销和最大会话数

Spring Security 3 以编程方式登录

Spring Security 5 OAuth 2 社交注销

简单两步快速实现shiro的配置和使用,包含登录验证角色验证权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)