servlet接收html传递的json数据和返回json数据出现的问题

今天写了个servlet出现的几个问题记录一下。
下面所说不是servlet和jsp相互传递。
一共三个问题:
1、出现postman使用post请求传递json数据时,接收的数据全部为null。
2、代码执行完成,没有报错且数据成功插入数据库,但是浏览器却出现如下错误
(No ‘Access-Control-Allow-Origin’ header is present on the requested resource)
3、使用request.setAttribute向html返回信息,是根本传递不过数据的。
查了一下好像是因为request数据所保存的有效期只有一次请求。我们想要将数据传递出去,下面必须要转发到需要数据的页面才能把数据带过去吧。(个人见解只是猜的,大家还是自行查资料。)

问题一

下面先给上单独问题的解决办法,在给上全部代码。
第一个问题接收数据全部为null,这段代码是在网上找的一个大佬的。
大佬链接:https://www.aliyun.com/jiaocheng/772077.html
代码:

       BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));	//将数据使用流进行传递
        StringBuffer strb = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {	//遍历数据
        	strb = strb.append(line);			//数据暂存StringBuffer
		}
       HashMap map = JSONObject.parseObject(strb.toString(), HashMap.class);	
       // 使用阿里的fastjson jar包处理json数据(这里是用map进行接收的,你也可以定义vo层容器类接收)
       		String name = map.get("name").toString();
		String email = map.get("email").toString();
		String phone = map.get("phone").toString();
		String demend = map.get("demend").toString();

好了这样就可以接收到参数了,说明一下我当时使用postman接收不到参数,但是前端调用时发现使用上面的方法接收不到数据,但是使用之前的request.getParameter(""); 却可以拿到数据……。暂且留下备用吧!

问题二

代码执行完成数据存入数据库且控制台并没有出现错误信息。但是浏览器出现了(No ‘Access-Control-Allow-Origin’ header is present on the requested resource)错误。说是跨域问题。
附大佬链接:https://blog.csdn.net/qq_39403545/article/details/82116121
这个代码等最后一起上。

问题三

使用request.setAttribute向html返回信息,传递不过去。
大佬链接:https://blog.csdn.net/yanghan1222/article/details/78447231
下面代码:

		Gson gson = new Gson();		
		String str = gson.toJson(flag);	//gson.toJson(flag); 将 flag转换为json字符串
		response.setCharacterEncoding("UTF-8");  
		response.setContentType("application/json; charset=utf-8"); 
		PrintWriter writer = response.getWriter();	//通过response获得一个输出流
		writer.append(str);						

下面上全部的代码了

@WebServlet("/Site")
public class Site extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
       /* BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));
        StringBuffer strb = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
        	strb = strb.append(line);
		}
        HashMap map = JSONObject.parseObject(strb.toString(), HashMap.class);
        String name = map.get("name").toString();
		String email = map.get("email").toString();
		String phone = map.get("phone").toString();
		String demend = map.get("demend").toString();*/
	//----------------------------------------上面被我注掉了,根据情况选择使用哪一种方法取值-----------------------------------------------------	
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String phone = request.getParameter("phone");
		String demend = request.getParameter("demend");
		boolean flag = false;
		if(null != name || null != phone) {
			String sql="INSERT INTO site_need(name,email,phone,demend,time)VALUES(?,?,?,?,?)";
			Connection conn=null;
			PreparedStatement ps=null;
			try { 
				conn=ConnUtil.getConnection();
				ps=conn.prepareStatement(sql);
				ps.setString(1,name);
				ps.setString(2,email);
				ps.setString(3, phone);
				ps.setString(4,demend);
				ps.setTimestamp(5, new Timestamp(System.currentTimeMillis()));
				ps.executeUpdate();
				flag = true;
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				ConnUtil.closeConnection(ps, conn);
			}
		}
		Gson gson = new Gson();
		String str = gson.toJson(flag);
		response.setCharacterEncoding("UTF-8");  
		response.setContentType("application/json; charset=utf-8"); 
		PrintWriter writer = response.getWriter();
		writer.append(str);
	}

}

请求头过滤代码(这个就是问题二的代码)

public class CorsFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		  HttpServletResponse response = (HttpServletResponse) servletResponse;
	        HttpServletRequest request = (HttpServletRequest)servletRequest;
	 
	        String origin = request.getHeader("Origin");
	        response.setHeader("Access-Control-Allow-Origin", origin);
	        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
	        response.setHeader("Access-Control-Max-Age", "3600");
	        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
	        response.setHeader("Access-Control-Allow-Credentials", "true");
	        String method = request.getMethod();
	        if(method.equalsIgnoreCase("OPTIONS")){
	            servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
	        }else{
	            filterChain.doFilter(servletRequest, servletResponse);
	        }
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}


}

web.xml (问题二需要配置filter)

<filter>
    <filter-name>corsFilter</filter-name>
    <filter-class>net.qhkj.site.util.CorsFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>corsFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
  	<servlet-name>site</servlet-name>
  	<servlet-class>net.qhkj.site.controller.Site</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>site</servlet-name>
  	<url-pattern>/site</url-pattern>
  </servlet-mapping>

猜你喜欢

转载自blog.csdn.net/weixin_42563880/article/details/85160946