我有一个处理该URL的方法:

http://IP:PORT/auth/myapp?Username=username


并且可以从远程访问。但是我无法更改使用我的应用程序的外部系统,它会在HTTP标头中发送用户名。我的意思是他们访问了该URL:

http://IP:PORT/auth/myapp


我认为我可以获得如下相关的HTTP标头:

Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
    String headerName = (String)headerNames.nextElement();
    if (headerName.equals("UNAME")) {
        String username = request.getHeader(headerName);
    }
}


我无法修改应用程序的整个部分,因此必须将该信息作为路径参数添加到现有请求中。我的意思是将该请求更改为:

http://IP:PORT/auth/myapp?Username=username


我怎样才能做到这一点?

PS:
这段代码可以解决我描述的问题吗?

if (request.getParameter("Username") == null) {
    Enumeration headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String headerName = (String) headerNames.nextElement();
        if (headerName.equals("UNAME")) {
            String username = request.getHeader(headerName);
            response.sendRedirect(request.getRequestURI() + "&Username="+username);
        }
    }
}

最佳答案

如果您正在应用程序其他部分中使用HttpServletRequest.getParameter('username')访问“用户名”查询参数,则可以尝试使用HttpServletRequestWrapper

class MyRequestWrapper extends HttpServletRequestWrapper{

    public String getParameter(String name){
        // if name equals username, call super.getHeader('username')
        //else super.getParameter(name);
    }
}


您可以扩展此类并重写getParameter()方法。在您的实现中,如果参数名称为username,则从标头获取值,否则调用super方法。

09-10 11:07
查看更多