请求header_java在过滤器中为http请求加请求头header

9e8d9ae6a60bc4dc923e307b9a177220.png

前言

现在有一个需求场景是,每一个请求我都需要在请求头里面加上token这个请求头,作为一种校验机制,传统的接口可以通过设置一个全局的变量,然后通过页面携带过来(大概就是先将我们的token放在session中,写一个服务用来获取session中的token,然后主页面用ajax调用接口,将token放在隐藏域中,然后将请求头放进来,用ajax方法,这里不想洗说了),但是有一种情况是通过页面传递的并不一定都会适用所有接口,比如上传和下载的接口有时候头里面就没有token参数,可能是上传和下载是用表单提交的 这个时候如何将请求头通过后台的方法加进来? 想到用过滤器,用后台方法强制加入请求头。

HTTP请求头

关于http请求头的相关信息可以参考这票博客,这里就不画蛇添足了 https://blog.csdn.net/alexshi5/article/details/80379086 下面直接上如何通过filter为请求添加请求头参数:

新建请求控制类

  1. package com.bitplan.smartCRM.web;
  2. import java.io.IOException;
  3. import java.util.Collections;
  4. import java.util.Enumeration;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import javax.servlet.Filter;
  9. import javax.servlet.FilterChain;
  10. import javax.servlet.FilterConfig;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.ServletRequest;
  13. import javax.servlet.ServletResponse;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletRequestWrapper;
  16. public class HeaderMapRequestWrapper extends HttpServletRequestWrapper {
  17. /**
  18. * construct a wrapper for this request
  19. *
  20. * @param request
  21. */
  22. public HeaderMapRequestWrapper(HttpServletRequest request) {
  23. super(request);
  24. }
  25. private Map<String, String> headerMap = new HashMap<String, String>();
  26. /**
  27. * add a header with given name and value
  28. *
  29. * @param name
  30. * @param value
  31. */
  32. public void addHeader(String name, String value) {
  33. headerMap.put(name, value);
  34. }
  35. @Override
  36. public String getHeader(String name) {
  37. String headerValue = super.getHeader(name);
  38. if (headerMap.containsKey(name)) {
  39. headerValue = headerMap.get(name);
  40. }
  41. return headerValue;
  42. }
  43. /**
  44. * get the Header names
  45. */
  46. @Override
  47. public Enumeration<String> getHeaderNames() {
  48. List<String> names = Collections.list(super.getHeaderNames());
  49. for (String name : headerMap.keySet()) {
  50. names.add(name);
  51. }
  52. return Collections.enumeration(names);
  53. }
  54. @Override
  55. public Enumeration<String> getHeaders(String name) {
  56. List<String> values = Collections.list(super.getHeaders(name));
  57. if (headerMap.containsKey(name)) {
  58. values.add(headerMap.get(name));
  59. }
  60. return Collections.enumeration(values);
  61. }
  62. }

新建过滤器

注意:需要将请求头里面没有token的接口后面带上token参数,参数名是“”token“”

  1. public class RemoteAddrFilter implements Filter {
  2. @Override
  3. public void destroy() {
  4. }
  5. @Override
  6. public void doFilter(ServletRequest request, ServletResponse response,
  7. FilterChain chain) throws IOException, ServletException {
  8. HttpServletRequest req = (HttpServletRequest) request;
  9. HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req);
  10. //获得请求参数中的token值
  11. String token = request.getParamter("token");
  12. if(!StringUtils.isEntry(token)){
  13. //如果请求中带有这个参数,则进行过滤加一个header头
  14. requestWrapper.addHeader("tokenr", token);
  15. chain.doFilter(requestWrapper, response); // Goes to default servlet.
  16. }
  17. chain.doFilter(request, response); // Goes to default servlet.
  18. }
  19. @Override
  20. public void init(FilterConfig filterConfig) throws ServletException {
  21. }

这个时候请求头中是会带有这个token,但是你可能用右键F12看不到这个头,相当于是一层伪代理,我们的接口是已经加上token校验。

总结

查找了很多资料,百度找到的和其他博客上说的感觉都是大同小异,并没有达到想要的效果。我觉得写博客就得一针见血,什么问题必须标书清楚,不要为了写而写,你可能不知道当人看了半天你的博客但是却没有得到问题的解决是一件多么痛苦的过程。最后是在https://stackoverflow.com上面找到的答案,当百度找不到答案时尝试谷歌,谷歌找不到时尝试下stackoverflow。 查找问题的搜索词也很重要,这些都需要有相关的经验才可以快速的定位问题,快速的找到解决办法,这才是一个资深程序眼必须会的一项技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值