将Http基本身份验证添加到servletRequest [英] Add Http Basic Authentication to servletRequest
问题描述
我有一个ProxyServlet
来处理从我的应用程序发送到另一台服务器(使用HTTP基本身份验证)的请求,并且我想在Servlet触发实际请求之前手动添加标头,这样用户就不必输入任何内容凭据.
I have a ProxyServlet
to handle requests to another server (which uses HTTP Basic Authentication) sent from my Application, and i want to add the header manually before the Servlet fires the actual request so the User wont have to enter any credentials.
我已经在下面使用HttpServletRequestWrapper
public class DataServlet extends ProxyServlet {
@Override
protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
throws ServletException, IOException {
final SystemCredentials credentials = new SystemCredentials("username", "password");
HttpServletRequestWrapper wrap = new HttpServletRequestWrapper(servletRequest){
@Override
public String getHeader(String name) {
if (name.equals("Authorization")){
String encoding = Base64.getEncoder().encodeToString((credentials.getUser().concat(":").concat(credentials.getPassword()).getBytes()));
return "Basic " + encoding;
} else
return super.getHeader(name);
}
};
super.service(wrap, servletResponse);
}
}
当我尝试访问它时,它似乎不起作用,显示一个弹出窗口,并要求提供远程服务器的凭据.
It doesnt seem to work, when i try to access it, shows a pop-up and asks for credentials for the remote server.
我的web.xml包含
My web.xml contains
<servlet>
<servlet-name>data</servlet-name>
<servlet-class>foo.package.servlet.DataServlet</servlet-class>
<init-param>
<param-name>targetUri</param-name>
<param-value>http://fooServer/DataServer</param-value>
</init-param>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>data</servlet-name>
<url-pattern>/DataServer/*</url-pattern>
</servlet-mapping>
还有其他方法可以使这项工作吗?
Is there any other way to make this work?
谢谢!
推荐答案
解决方案是覆盖方法getHeader(String name)
,getHeaders(String name)
和getHeaderNames()
,如下所示.这也取决于实现如何查找标头.在这种情况下,ProxyServlet
正在通过Enumeration<String> getHeaders(String name)
查找.
Solution was to override the methods getHeader(String name)
, getHeaders(String name)
and getHeaderNames()
as shown below. This depends also on how the implementation is looking for headers. In this case ProxyServlet
is looking via Enumeration<String> getHeaders(String name)
.
HttpServletRequestWrapper wrap = new HttpServletRequestWrapper(servletRequest){
@Override
public String getHeader(String name) {
if (name.equals(HttpHeaders.AUTHORIZATION)){
String encoding = Base64.getEncoder().encodeToString((credentials.getUser().concat(":").concat(credentials.getPassword()).getBytes()));
return "Basic " + encoding;
}
return super.getHeader(name);
}
@Override
public Enumeration<String> getHeaders(String name) {
if (name.equals(HttpHeaders.AUTHORIZATION)){
List<String> temp = new ArrayList<>();
String encoding = Base64.getEncoder().encodeToString((credentials.getUser().concat(":").concat(credentials.getPassword()).getBytes()));
temp.add("Basic " + encoding);
return Collections.enumeration(temp);
}
return super.getHeaders(name);
}
@Override
public Enumeration<String> getHeaderNames() {
// TODO Auto-generated method stub
List<String> temp = Collections.list(super.getHeaderNames());
temp.add(HttpHeaders.AUTHORIZATION);
return Collections.enumeration(temp);
}
};
这篇关于将Http基本身份验证添加到servletRequest的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!