今天在使用vscode编写前端代码,使用axios跨域请求servlet时,将参数经过JSON.stringify()处理后写在请求体里,在后端servlet里试图使用request.getParameter()获取参数未果,特此记录。。。
首先我的编码方式和允许跨域的设置配置在过滤器中CorsFilter和SetCharFilter
一、CorsFilter
@WebFilter("/*")
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials","true");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
二、SetCharFilter
@WebFilter("/*")
public class SetCharFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
接下来前端使用axios发送请求,这是一个请求所有分页后的数据的方法
fenye(pageIndex) {
console.log("pageIndex=" + pageIndex)
axios.post('http://localhost:8080/listEmp', JSON.stringify({
pageIndex: pageIndex,
pageSize: this.pageSize,
queryName: this.queryName
}))
.then(response => {
this.pageInfo = response.data
})
.catch(error => {
console.log(error);
});
};
接下来就是servlet获取参数并处理请求。现在我们需要回想一下HTTP请求中参数传递的方式。通常,前端通过GET和POST方法发送数据,参数一般是在URL查询字符串或者表单数据中,这时候servlet可以用getParameter()获取,但是现在数据是作为JSON放在请求体中,那getParameter()是无法直接拿到的,所以可以换成读取输入流来获取。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//因为一会需要拼接字符串所以先创建一个StringBuilder对象
StringBuilder stringBuilder = new StringBuilder();
//读取请求体
BufferedReader reader = request.getReader();
String line;
//逐行读取请求体中的内容并追加到StringBuilder中
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
//创建一个ObjectMapper对象,这是Jackson库的核心类,用于将JSON字符串解析为Java对象
ObjectMapper om = new ObjectMapper();
//将获取到的JSON字符串解析为map集合
Map<String, Object> map = om.readValue(stringBuilder.toString(), new TypeReference<Map<String, Object>>() {
});
//获得参数
int pageIndex = (int) map.get("pageIndex");
int pageSize = (int) map.get("pageSize");
String queryName = (String) map.get("queryName");
}