跨域访问servlet无法获取参数问题解决

今天在使用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");
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值