前言
本文解决以下问题:
- SpringBoot中如何添加一个过滤器?
- 如何在过滤器中使用Bean?
- 如何判断请求的类型?GET还是POST?
- 如何获取请求中的参数?
- 如何重定向?
- 如何针对Ajax请求返回JSON串?
如果你的关注点不在以上问题范围内,请路过。
添加过滤器
使用注解@WebFilter,并把它加到一个实现了Filter接口的类上,如下:
@WebFilter(filterName = "tokenFilter",urlPatterns = {"/*"})
public class TokenFilter implements Filter {
…………
}
可以轻松添加一个过滤器。urlPatterns为要过滤的路径。可以配合@Order注解,指定多个过滤器的执行顺序。
在SpringBoot的启动类上,添加@ServletComponentScan注解,使得过滤器有效。
使用Bean
通过以上方式添加的过滤器,默认是交给Spring管理的。所以,你可以在过滤器中*的使用@Autowired,@Resource,@Value等注解。
@Resource
private TokenDao tokenDao;
@Value("${test}")
private Boolean test;
@Value("${error.url}")
private String errorUrl;
把Servlet的请求或响应转换成HttpServlet的请求或响应
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
判断请求类型
通过HttpServletRequest的getMethod方法可以得到一个String类型的结果,结果可能是GET、POST或者其它。
String method = req.getMethod();
重定向
res.sendRedirect(this.errorUrl);
Ajax请求返回JSON
POST请求的返回数据一般要求是JSON形式的。
res.setCharacterEncoding("utf-8");
try (PrintWriter out = res.getWriter()) {
res.setContentType("application/json; charset=utf-8");
out.print(Result.failure().msg(message).log().json());
out.flush();
}
获取请求中的参数
请求的方式不同,参数获取的方式也不同。我们讨论前端框架为React情况下的两种常见情形。
GET方式,参数在URL中
URL形如:{{rootUrl}}/common/code/get?token=1050665544659152896&ran=41.3&sign=abcdde
这种情况,调用getParameter方法即可获得
token = req.getParameter("token");
POST方式,application/json。通过JSON形式发送参数
如下图:
这种情况,需要通过getReader方式获取流,再从流中读取
try{
try(BufferedReader reader = req.getReader()){
StringBuilder sb = new StringBuilder();
String s;
while((s = reader.readLine()) != null) {
sb.append(s.trim());
}
TokenForm tokenForm = JSON.parseObject(sb.toString(), TokenForm.class);
if (tokenForm != null && tokenForm.getToken() != null && tokenForm.getSign() != null
&& tokenForm.getRan() != null) {
return tokenForm;
} else {
return null;
}
}
} catch (IOException e) {
return null;
}