版权声明:希望能和看到文章的你交个朋友 https://blog.csdn.net/u012954706/article/details/84884213
前言
我们经常会用到后去PV,UV,有时候,
1、判断访问我们网站的ip,
2、以及我们有多个域名,他想知道访问我们的是哪个域名,
3、他想知道访问的是哪个路径(接口)
那么Request就必不可少楼
1、获取Request方法
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 静态获取HttpServletRequest 和 session的方法
* 要使用此类需要在web.xml注册org.springframework.web.context.request.RequestContextListener
*/
public class RequestHolder {
public static HttpSession getSession() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return request.getSession();
}
public static HttpServletRequest getRequest() {
return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
}
public static HttpServletResponse getResponse() {
return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
}
}
2、获取Ip
public static String getIp(){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
if(request==null)return null;
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if(ip.toLowerCase().contains("x-forwarded-for")){
String ip_temp = "";
if(ip.contains(":") && ip.split(":").length>0 && !ip.endsWith(":")){
ip_temp = ip.split(":")[1];
if(StringUtils.isBlank(ip_temp)) ip_temp = ip.substring(0,ip.lastIndexOf("X-Forwarded-For"));
}else{
ip_temp = ip.substring(0,ip.lastIndexOf("X-Forwarded-For"));
}
ip = ip_temp.replaceAll(" ","");
}
if (ip.indexOf(",") > -1) {
String ip_temp = ip.split(",")[0];
ip_temp = ip_temp.replaceAll(" ", "");
if(ip_temp.startsWith("10.") && ip.split(",").length>1){
ip = ip.split(",")[1];
ip = ip.replaceAll(" ", "");
}else ip = ip_temp;
}
return ip;
}
3、Request中的其他东西
//http://test.healerjean.cn/healerjean/youhui/web/authorize?params=j4KDX9ovIC%2BD2dKT2FbgcKXduZ9FsJvN3Oq2Y4oBY5eq7qgl4x%2BWWQ%3D%3D
//http://localhost:8081/healerjean/youhui/web/authorize?params=j4KDX9ovIC%2BD2dKT2FbgcKXduZ9FsJvN3Oq2Y4oBY5eq7qgl4x%2BWWQ%3D%3D
3.1、request.getRequestURL 获取全部路径
log.info(request.getRequestURL().toString()); ////全部路径,不带参数 http://localhost:8081/healerjean/youhui/web/authorize
3.2、request.getHeader(“host”) 获取域名+端口(主机名加端口,80不显示)
log.info(request.getHeader("host")); //localhost:8081 test.healerjean.cn
3.3、request.getServerName 获取服务器的 主机名
log.info(request.getServerName()); //localhost test.healerjean.cn
3.4、request.getContextPath 、request.getServletPath 、request.getRequestURI具体路径
//4、当然我们的Springboot项目中是没有用项目的名字的,下面来源于网络)
System.out.println(request.getContextPath()); ///可返回站点的根路径。也就是项目的名字 打印结果:/news
System.out.println(request.getServletPath()); //打印结果:/main/list.jsp
System.out.println(request.getRequestURI()); //打印结果:/news/main/list.jsp
我的项目中,因为没有项目的名字,所以下面二者显示的是一样的
log.info(request.getRequestURI()); //我的项目中没有项目的名字 healerjean/youhui/web/authorize
log.info(request.getServletPath()); //healerjean/youhui/web/authorize
3.5、request.getServerPort() 获取端口号
log.info(request.getServerPort()+""); //8081 80
3.6、request.getLocalPort() 获取本机端口号(第二个是阿里云的)
log.info(request.getLocalPort()+""); //8081 8086
3.7、request.getQueryString() 访问的参数
log.info(request.getQueryString()); //参数 ,只适用于get
params=j4KDX9ovIC%2BD2dKT2FbgcKXduZ9FsJvN3Oq2Y4oBY5eq7qgl4x%2BWWQ%3D%3D
3.8、request.getHeader( “referer” ) 获取来源于上一次网页的url
如果是直接根据地址访问的则,则为null
log.info(request.getHeader( "referer" )); //进入这个地址之前是从那个连接过来的,防盗连接使用
3.9、request.getMethod 获取请求方法
request.getMethod() //POST 、GET
3.10、request.getContentType ContentType
request.getContentType()
//get方法中 :null
//post方法 :multipart/form-data; boundary=----WebKitFormBoundaryaIFtRs1mZ4nS9I7j
3.11、request.getParameterNames 获取参数
不适用contentType为multipart/form-data
获取参数的名字,不管你代码里面接收不接收,反正我这里是可以获取到的
request.getParameterNames()
Enumeration enu=request.getParameterNames();
while(enu.hasMoreElements()){
String paraName=(String)enu.nextElement();
System.out.println(paraName+": "+request.getParameter(paraName));
}
参数如下:
accessDate: 2019-01-02 00:00:00
pageNum: 1
pageSize: 10
post: Healerjean
3.12、request.getHeaderNames 获取head
request.getHeaderNames()
Enumeration headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
String paraName=(String)headerNames.nextElement();
System.out.println(paraName+": "+request.getHeader(paraName));
}
Post方法
host: localhost:8081
connection: keep-alive
content-length: 453
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
cache-control: no-cache
origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
postman-token: bfd0da34-bed9-b903-e852-5656de78883c
token: ZDjQ7mDEwlU7t6yEcAK2Xw==
content-type: multipart/form-data; boundary=----WebKitFormBoundaryaIFtRs1mZ4nS9I7j
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en,zh-CN;q=0.9,zh;q=0.8
get方法
host: localhost:8081
connection: keep-alive
cache-control: max-age=0
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: en,zh-CN;q=0.9,zh;q=0.8
cookie: _Token=9UUife5cUeoOLO4AOaExoA==; _aToken=ceshib; ab.storage.userId.8f0d3f99-1e3f-4444-bb6c-f73da32cc97c=%7B%22g%22%3A%22437277%22%2C%22c%22%3A1546077272288%2C%22l%22%3A1546077272288%7D; ab.storage.deviceId.8f0d3f99-1e3f-4444-bb6c-f73da32cc97c=%7B%22g%22%3A%229a4b0cd9-da59-9c0e-5aee-a8356e4ea5dd%22%2C%22c%22%3A1546077272296%2C%22l%22%3A1546077272296%7D; ab.storage.sessionId.8f0d3f99-1e3f-4444-bb6c-f73da32cc97c=%7B%22g%22%3A%22c137279a-3f33-6df2-b1fa-189f47793f93%22%2C%22e%22%3A1546079072315%2C%22c%22%3A1546077272293%2C%22l%22%3A1546077272315%7D; CONTAINERID=7485f72559e40cd7d5f09b1347a03d3a73e9a0be752d74c0f76412a132033784|XC3gl|XC3gW; JSESSIONID=13A2286D04353AD554B27FF77DF8CABA
3.13、request.getParameterMap 获取参数map值
不适用contentType为multipart/form-data
request.getParameterMap()
Map<String, String[]> parameterMap = request.getParameterMap();
log.info(JsonUtils.toJson(parameterMap));
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey());
for (String string : entry.getValue()) {
System.out.println(string);
}
System.out.println("----------------");
}
4、对于大数据参数的读取
1.getQueryString()
只适用于GET,比如客户端发送http://localhost/testServlet?a=b&c=d&e=f,通过request.getQueryString()得到的是a=b&c=d&e=f.
2.getParameter()
GET和POST都可以使用
但如果是POST请求要根据,表单提交数据的编码方式来确定能否使用.当编码方式是(application/x- www-form-urlencoded)时才能使用.
这种编码方式(application/x-www-form-urlencoded)虽然简单,但对于传输大块的二进制数据显得力不从心.
对于传输大块的二进制数这类数据,浏览器采用了另一种编码方式("multipart/form-data"),这时就需要使用下面的两种方法.
3.getInputStream()
4.getReader()
上面两种方法获取的是Http请求包的包体,因为GET方式请求一般不包含包体.所以上面两种方法一般用于POST请求获取参数.
需要注意的是:
request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。所以一般使用一次就可以了
感兴趣的,欢迎添加博主微信,
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信 | 微信公众号 | 支付宝 |
---|---|---|