SpringBoot过滤器 判断请求类型 获取参数 Ajax返回

时间:2024-03-16 09:42:27

前言

本文解决以下问题:

  1. SpringBoot中如何添加一个过滤器?
  2. 如何在过滤器中使用Bean?
  3. 如何判断请求的类型?GET还是POST?
  4. 如何获取请求中的参数?
  5. 如何重定向?
  6. 如何针对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形式发送参数

如下图:

SpringBoot过滤器 判断请求类型 获取参数 Ajax返回

SpringBoot过滤器 判断请求类型 获取参数 Ajax返回

 

这种情况,需要通过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;

}