java 获取HttpRequest Header 的几种方法

摘要: 在开发应用程序的过程中,如果有多个应用,通常会通过一个portal 门户来集成,这个portal  是所有应用程序的入口,用户一旦在portal 登录之后,进入另外一个系统,就需要类似的单点登录(SSO). 进入各个子系统的时候,就不需要再次登录, 当然类似的功能,你可以通过专业的单点登录软件来实现,也可以自己写数据库token 等方式来实现。其实还有一个比较简单的方法,就是通过 portal 封装已经登录过的用户的消息,写到http header 之中,然后把请求forward 到各个子系统中去,而各子系统从 http header 中获取用户名,作为是否登录过的校验或者合法的校验。总结了几种处理http Header 的方法

在开发应用程序的过程中,如果有多个应用,通常会通过一个portal 门户来集成,这个portal 是所有应用程序的入口,用户一旦在portal 登录之后,进入另外一个系统,就需要类似的单点登录(SSO). 进入各个子系统的时候,就不需要再次登录, 当然类似的功能,你可以通过专业的单点登录软件来实现,也可以自己写数据库token 等方式来实现。其实还有一个比较简单的方法,就是通过 portal 封装已经登录过的用户的消息,写到http header 之中,然后把请求forward 到各个子系统中去,而各子系统从 http header 中获取用户名,作为是否登录过的校验或者合法的校验。总结了几种处理http Header 的方法:

利用 HttpServletRequest

import javax.servlet.http.HttpServletRequest;
 
  //...
  private HttpServletRequest request;
 
  //get request headers
  private Map getHeadersInfo() {
 
	Map map = new HashMap();
 
	Enumeration headerNames = request.getHeaderNames();
	while (headerNames.hasMoreElements()) {
		String key = (String) headerNames.nextElement();
		String value = request.getHeader(key);
		map.put(key, value);
	}
 
	return map;
  }


一个典型的例子如下:
"headers" : {
	"Host" : "yihaomen.com",
	"Accept-Encoding" : "gzip,deflate",
	"X-Forwarded-For" : "66.249.x.x",
	"X-Forwarded-Proto" : "http",
	"User-Agent" : "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
	"X-Request-Start" : "1389158003923",
	"Accept" : "*/*",
	"Connection" : "close",
	"X-Forwarded-Port" : "80",
	"From" : "googlebot(at)googlebot.com"
}


获取 user-agent
 import javax.servlet.http.HttpServletRequest;
 
  //...
  private HttpServletRequest request;
 
  private String getUserAgent() {
	return request.getHeader("user-agent");
  }

一个典型的例子如下:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)


利用 spring mvc 获取 HttpRequest Header 的例子
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
@RequestMapping("/site")
public class SiteController {
 
	@Autowired
	private HttpServletRequest request;
 
	@RequestMapping(value = "/{input:.+}", method = RequestMethod.GET)
	public ModelAndView getDomain(@PathVariable("input") String input) {
 
		ModelAndView modelandView = new ModelAndView("result");
 
		modelandView.addObject("user-agent", getUserAgent());
		modelandView.addObject("headers", getHeadersInfo());
 
		return modelandView;
 
	}
 
	//get user agent
	private String getUserAgent() {
		return request.getHeader("user-agent");
	}
 
	//get request headers
	private Map getHeadersInfo() {
 
		Map map = new HashMap();
 
		Enumeration headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			String key = (String) headerNames.nextElement();
			String value = request.getHeader(key);
			map.put(key, value);
		}
 
		return map;
	}
 
}


也许有人会说,Http Header 是可以模拟的,那么自己可以构造一个用来欺骗这些系统, 是的,的确是这样,所以在用Http Header 来传值得时候,一定要记得,所有的请求都必须经过 portal 来处理,然后 forward 到各子系统,就不会出现这个问题了。因为portal 首先拦截用户发起的所有的请求,如果是构造的用户,在portal 的sessiion 也是没有记录的,仍然会跳转到登录页面,如果在protal 的 session 中记录,而且 Http Header 中也有记录,那么在子系统就是合法的用户,然后自己可以根据一些要求处理业务逻辑了。

上一篇: 百度BAE想说爱你并不容易
下一篇: java 自定义注解 (custom annotation)
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号