今天写了个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 = JSON .parse (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 = JSON .parse (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.

<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>
收藏 打印