1. 程式人生 > >SpringBoot過濾器 判斷請求型別 獲取引數 Ajax返回

SpringBoot過濾器 判斷請求型別 獲取引數 Ajax返回

前言

本文解決以下問題:

  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形式傳送引數

如下圖:

這種情況,需要通過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;

}