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 Security 5 OAuth 2 社交注销
简单两步快速实现shiro的配置和使用,包含登录验证角色验证权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)