所以我在这里疯了。在我工作的地方,每个人都会自动登录到公司的主页,并且也会显示在其他内部页面中。我正在创建Java Rest API,需要引入已经存储在浏览器中的用户。
我有一个使用Jersey的动态项目,它正在按预期方式工作。
我一直在寻找不同的方法,下面的这一方法不断返回null。
@Context
protected SecurityContext sc;
然后我尝试通过VI来拉那个。
System.out.println(sc.getUserPrincipal());
或
System.out.println(sc.getAuthenticationScheme());
都返回NULL。
我看到了一些有关JSP代码的信息,该代码本应吸引当前的浏览器用户。
<%@ page import="java.util.Base64" %>
<%@ page import="java.util.regex.Matcher"%>
<%@ page import="java.util.regex.Pattern"%>
<%
HttpSession sess = request.getSession();
String auth = request.getHeader("Authorization");
String result = "";
String which = "not NTLM ";
Base64.Encoder mimeEncoder = Base64.getMimeEncoder();
Base64.Decoder mimeDecoder = Base64.getMimeDecoder();
if (auth == null) {
response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM");
return;
}
if (auth.startsWith("NTLM ")) {
which = "NTLM ";
byte[] msg = mimeDecoder.decode(auth.substring(5));
int off = 0, length, offset;
String s;
if (msg[8] == 1) {
off = 18;
byte z = 0;
byte[] msg1 =
{(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S',
(byte)'S', (byte)'P', z,
(byte)2, z, z, z, z, z, z, z,
(byte)40, z, z, z, (byte)1, (byte)130, z, z,
z, (byte)2, (byte)2, (byte)2, z, z, z, z,
z, z, z, z, z, z, z, z};
response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM " + mimeEncoder.encodeToString(msg1).trim());
return;
}
else if (msg[8] == 3) {
off = 30;
length = msg[off+17]*256 + msg[off+16];
offset = msg[off+19]*256 + msg[off+18];
s = new String(msg, offset, length);
}
else {
return;
}
length = msg[off+1]*256 + msg[off];
offset = msg[off+3]*256 + msg[off+2];
s = new String(msg, offset, length);
length = msg[off+9]*256 + msg[off+8];
offset = msg[off+11]*256 + msg[off+10];
s = new String(msg, offset, length);
result=s.replaceAll("\\W", "");
}
%>
<p>Username: <%=result %> <%=which %></p>
实际上返回当前浏览器的用户名。
那么我在Java Rest中做错了什么,阻止了它引入用户名? 我需要强迫该人登录其余人吗?真的不想这样做。