修改HttpServletRequest的路径参数

时间:2015-10-20 14:20:13

标签: java servlets

我有一个处理该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);
        }
    }
}

3 个答案:

答案 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)

我认为有两种解决方案:

  1. 在每个请求上映射的应用程序上使用过滤器。如果UNAME标题在那里,过滤器将检查标题并添加参数
  2. 在Web应用程序前使用Apache重写模块。重写模块会将参数添加到url(检查"模块Apache mod_rewrite")
  3. 更新:正如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网址发送重定向请求