SpringBoot過濾器 判斷請求型別 獲取引數 Ajax返回
阿新 • • 發佈:2018-12-15
前言
本文解決以下問題:
- 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;
}