springboot Filter 截取 restful 的请求参数
2017-05-14 17:24
639 查看
初学springboot ,想自己定义一个 filter 截取参数用来验证签名,发现HttpServletRequest 并不能直接获取 json字符串,只能获取链接里的参数。
首先定义一个Filter文件, 然后实现Filter 的接口
然后将filter添加都请求链中
因为article 方法是post 的,所以在postman 里 用post的方法 输入以下链接
看到的log
哈哈,现在都是restful的 天下,这样的filter显然不能满足当初定下的目标。注释掉的代码有用处了哈哈
就是这行代码
SmaugFilter 继承了一个父类的BaseFilter
此时postman的参数
得到的log日志
此时可以针对不同的请求进行不同的预先操作,比如 权限验证
首先定义一个Filter文件, 然后实现Filter 的接口
package smaug.common.filters; import com.alibaba.fastjson.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Map; /** * Created by naonao on 17/5/14. */ @WebFilter(filterName = "smaugFilter2", urlPatterns = "/*") public class SmaugFilter extends BaseFilter implements Filter { Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; //获取nginx http的真实IP String realIp = httpServletRequest.getHeader("X-Real-IP"); // Map<String, Object> map = readJsonMap(httpServletRequest); // logger.info("filter => " + servletRequest.getRemoteHost() + " " + JSONObject.toJSONString(map)); String quaryString = httpServletRequest.getQueryString(); logger.info("quaryString => " + quaryString); String restUrl = (httpServletRequest.getRequestURL().toString()); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
然后将filter添加都请求链中
package smaug.common.configs; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import smaug.common.filters.SmaugFilter; /** * Created by naonao on 17/5/14. */ @Component public class FilterConfig { @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(smaugFilter()); bean.setOrder(1); bean.addUrlPatterns("/*"); return bean; } @Bean public SmaugFilter smaugFilter() { return new SmaugFilter(); } }
因为article 方法是post 的,所以在postman 里 用post的方法 输入以下链接
http://localhost:3031/smaug/test/article?a=1&b=2
看到的log
2017-05-14 16:22:34.736 INFO 70532 --- [nio-3031-exec-1] smaug.common.filters.SmaugFilter : quaryString => a=1&b=2
哈哈,现在都是restful的 天下,这样的filter显然不能满足当初定下的目标。注释掉的代码有用处了哈哈
就是这行代码
Map<String, Object> map = readJsonMap(httpServletRequest);
SmaugFilter 继承了一个父类的BaseFilter
package smaug.common.filters; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.util.Map; /** * Created by naonao on 17/5/14. */ public class BaseFilter { public String readJSONString(HttpServletRequest request) { StringBuffer json = new StringBuffer(); String line = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) { json.append(line); } } catch (Exception e) { System.out.println(e.toString()); } return json.toString(); } public Map<String, Object> readJsonMap(HttpServletRequest request) { String json = readJSONString(request); return JSONObject.parseObject(json, new TypeReference<Map<String, Object>>() { }); } }
此时postman的参数
"name" : "闹闹", "age" : 12, "requestId" : "12esdadfe3ed" }
得到的log日志
{"requestId":"12esdadfe3ed","name":"闹闹","age":12}
此时可以针对不同的请求进行不同的预先操作,比如 权限验证
相关文章推荐
- 关于springboot的RestFul的PUT请求,前台参数接收问题
- spring boot 加入jsp自定义标签对get请求参数加密
- Kotlin + Spring Boot 请求参数验证
- springboot重写SpringMVC请求参数装载
- 解决Spring Boot中,通过filter打印post请求的 request body 问题
- 使用Jersey客户端请求Spring Boot(RESTFul)服务
- spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别
- SpringMVC或SpringBoot请求时间参数报错处理方法
- springboot获取URL请求参数的多种方式
- springboot获取URL请求参数的几种方法
- spring boot 自定义请求参数解析注解
- Spring Boot中请求参数获取
- springBoot PUT请求接收不了参数的解决办法
- SpringBoot设置Filter过滤请求参数
- Spring boot PUT、DELETE 请求无法定位方法及获取参数解决方案
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
- SpringBoot自定义请求参数注解
- 详解如何使用Jersey客户端请求Spring Boot(RESTFul)服务
- springboot中put请求获取不到参数解决
- SpringBoot构建Restful service完成Get和Post请求