gpt4 book ai didi

java - getUserPrincipal 返回 null

转载 作者:行者123 更新时间:2023-11-29 07:43:04 25 4
gpt4 key购买 nike

我在前端使用 AngularJS,在后端使用 Java EE。我创建了两种使用 RESTful 服务登录和注销的方法:

@POST
@Path("login")
@Produces("application/json")
public Response login(@Context HttpServletRequest req, UserTable user) {
if (req.getUserPrincipal() == null) {
try {
req.login(user.getUsername(), user.getPassword());
} catch (ServletException e) {
return Response.status(Response.Status.BAD_REQUEST).type("text/plain").entity("Login or Password is incorrect").build();
}
} else {
return Response.status(Response.Status.OK).type("text/plain").entity("You are already logged in").build();
}
return Response.status(Response.Status.OK).type("text/plain").entity("Login successfull").build();
}

@GET
@Path("logout")
@Produces("application/json")
public Response logout(@Context HttpServletRequest req) {
try {
req.logout();
req.getSession().invalidate();
} catch (ServletException e) {
return Response.status(Response.Status.BAD_REQUEST).type("text/plain").entity("Can not logout").build();
}
return Response.status(Response.Status.OK).type("text/plain").entity("Logout successfull").build();
}

在前端,我使用这些方法:

    $http.post(apiUrl + 'usertable/login', {
username: 'admin',
password: 'admin'
});

$http.get(apiUrl + 'usertable/logout').success(function (a) {
var o = a;
});

我可以成功登录:

FINEST:   JDBC login succeeded for: admin groups:[Admin]
FINE: JAAS login complete.
FINE: JAAS authentication committed.
FINE: Password login succeeded for : admin

但是当我尝试注销或再次登录时,getUserPrincipal() 返回 null。我做错了什么?

最佳答案

在调用 login 方法之前手动创建 HTTP session 。

您可以通过调用 HttpServletRequest.getSession() 方法来完成此操作,如下所示:

req.getSession(true); // Creates a new HTTP Session BEFORE the login.
req.login(user.getUsername(), user.getPassword());

确保服务器在响应中返回 JSESSIONID cookie。之后浏览器会处理它并将其发送到服务器,您无需担心或自行处理。

登录响应

enter image description here

请求进一步调用(服务调用、检查登录、注销等)

enter image description here

更新

也许你需要告诉 AngularJS 发送 Cookies。对于我刚才阅读的内容,默认情况下似乎不发送 cookie。

试试这个帖子 $http doesn't send cookie in Requests

更新2

跨域策略可能很麻烦,但它们必须存在才能确保对网络内容的访问安全。 Java 服务器运行正常,正在进行身份验证并且正在共享 cookie。 Java 服务器从一开始就很好。

在跨域方面,任何中间件技术都存在同样的问题。

浏览器正在阻止您的应用程序,因为您的客户端域(运行 JavaScript 的地方)不允许访问 Java 服务器域。应用程序(您的 AngularJS 和 Java Server)在不同的域中执行,因此“幕后”的 JavaScript 调用被浏览器阻止。旧的 IE 版本过去允许它。

例子:

  • JavaScript 代码从本地主机或本地文件系统加载
  • Java 服务器正在运行 http://192.168.1.15:8080 (将其替换为您的 IP 或任何地址)

也许 JSONP可以拯救你:

JSONP allows a page to receive JSON data from a different domain by adding a element to the page which loads a JSON response with a callback from a different domain.

跨域策略将为两个应用程序验证:协议(protocol)主机名端口。如果一个不同,则安全发生并且程序失败。

更多信息在这里:Same-origin policy

您的 AngularJS 也没有问题。我过去遇到过这种情况,您可以使用纯 Java 脚本复制它(这是可以适应您的问题的功能代码):

function loadXMLDoc() {
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST","http://192.168.9.117:8080/restful-login-web/rest/loginservice/login",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("username=evandro&password=senha123");
}

以下错误将显示在您的浏览器控制台中:

XMLHttpRequest cannot load http://192.168.9.117:8080/restful-login-web/rest/loginservice/login. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

GET 调用也会发生这种情况。

您可以允许您的外部应用程序使用 JavaScript 与 Java 服务器通信,设置 Access-Control-Allow-Origin 有点像这样 (.header("Access-Control-Allow -来源", "*")):

return Response.status(Response.Status.OK).header("Access-Control-Allow-Origin", "*").type("text/plain").entity("Login successfull").build();

警告:将“*”替换为您的应用程序客户端正在运行的域。

我建议您调查跨域策略主题。如果可以,也许一个简单的解决方案是在 Java 容器中运行客户端 JavaScript。然后这两个应用程序将自动位于同一域中。

我的意思是,如果您使用 JSP/Servlet 发布您的应用程序客户端 Java 脚本,您就不会遇到这个问题。如果您在纯文件中开发 JavaScript,只需将它们包装在 Java Web 应用程序中即可。由于您将执行从“xyz.com”域中检索到的 Java 脚本代码,因此浏览器将允许在同一“xyz.com”中运行的 Java 代码交换信息。这会起作用。

很抱歉,我花了更多的时间才意识到您正在对不同的域进行 AJAX 调用。

如果你需要跨域通信(可能服务器是一个外部服务)而你找不到任何帮助我建议你另开一个专门针对跨域问题的问题。据我了解,此问题不再与 Java 服务器本身相关。

关于java - getUserPrincipal 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com