我有一个处理该URL的方法:
http://IP:PORT/auth/myapp?Username=username
可从远程访问。但是,我无法更改使用我的应用程序的外部系统,它在HTTP标头中发送用户名。我的意思是他们访问该网址:
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);
}
}
}
答案 0 :(得分:1)
如果您要访问用户名'在您的应用的其他部分使用HttpServletRequest.getParameter('用户名')查询参数,您可以尝试使用HttpServletRequestWrapper
class MyRequestWrapper extends HttpServletRequestWrapper{
public String getParameter(String name){
// if name equals username, call super.getHeader('username')
//else super.getParameter(name);
}
}
您可以扩展此类并覆盖getParameter()方法。在您的实现中,如果参数名称是username,则从header获取值,否则调用super方法。
答案 1 :(得分:0)
我认为有两种解决方案:
更新:正如mohit所说,使用HttpRequestWrapper结合过滤器
exports.signin = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).send(info);
} else {
/* Some calculations and user's object changes */
req.login(user, function(err) {
if(err) {
res.status(400).send(err);
} else {
console.log(delete user.password); // returns true
console.log(user.password); // still returns password :(
//user.save();
//res.json(user);
}
});
}
})(req, res, next);
};
并在MyCustomWrapperRequest中覆盖getParameter()函数
答案 2 :(得分:0)
它是一个回合,但如果您还有HttpServletResponse对象,则可以向http://IP:PORT/auth/myapp?Username=username网址发送重定向请求