java大事记

大事记

本文章专用于记录工作遇到的小坑小洼,原因及解决办法。

1、返回前端js不能是Long类型数据(2022-02-10)

产生背景:
在本次修改数据库主键从varchar改为bigint过程中,实体类的id的类型相应变为Long,但是数据返回给前端后不是返回的数据库数据,简单说是丢失了精度。

产生原因:JavaScript中数字的精度是有限的,Java的Long类型的数字超出了JavaScript的处理范围。JavaScript内部只有一种数字类型Number,所有数字都是采用IEEE754 标准定义的双精度64位格式存储,即使整数也是如此。这就是说,JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)。JavaScript 中能精准表示的最大整数是 2^{53} - 1,十进制为 9007199254740991。而Java的Long类型的有效位数是63位(扣除一位符号位),其最大值为2^{63}-1,十进制为9223372036854775807。所以导致返回给前端数据变化了。

解决办法:
①一、配置参数
Jackson有个配置参数WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字全部转成字符串输出。其功能介绍为:Feature
that forces all Java numbers to be written as JSON strings spring:

 jackson:
     generator:
       write_numbers_as_strings: true

优点是使用方便,不需要调整代码;
缺点是颗粒度太大,所有的数字都被转成字符串输出了,包括按照timestamp格式输出的时间也是如此
②二、注解
使用官方提供的Serializer

@JsonSerialize(using=ToStringSerializer.class)
private Long id;

或者自定义一个类

@JsonSerialize(using=LongJsonSerivalizer.class)
private Long id;
public class LongJsonSerivalizer extends JsonSerializer<Long> {
    @Override
    public void serialize(Long aLong, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String text = (aLong == null?null:String.valueOf(aLong));
        if(null != text){
            jsonGenerator.writeString(text);
        }
    }
}

优点是颗粒度可以很精细;
缺点同样是太精细,如果需要调整的字段比较多会比较麻烦

2.ajax请求后端不支持重定向

如果前端发起ajax请求,后端收到请求,一番处理后再想重定向,那就不行了。需要特殊处理。
前端处理代码:

  
                function logout() { 
                var cookie=getCookie("pa-if"); 
                  $.ajax({
					url:"http:10.119.104.181:9998/cas/logOut",
					data:{},
					type:'GET',
					dataType:'json',
					success:function(data){
						if(data.casError=='403' && data.redirect){
							var url=data.redirect+"&method=POST";
							window.location.href=url;
						}else{
						//不是403就前端自己安正常逻辑做重定向
						}
					},
					timeout:30000,
					error:function(){
					//处理错误
							}
						})
                     ); 

后端处理办法:

 /**
 * 判断是否是ajax请求进行不同方式的跳转
 */
public static void doRedirect(HttpServletRequest req, HttpServletResponse resp, String url) throws IOException {
    String xRequestedWith = req.getHeader(Constants.X_REQUESTED_WITH);
    boolean isAjaxRequest = (ObjectUtils.isNotEmpty(xRequestedWith) && Constants.XML_HTTP_REQUEST.equals(xRequestedWith.trim()))
            || ObjectUtils.isNotEmpty(req.getParameter(Constants.FACES_PARTIAL_AJAX_PARAMETER));
    if (isAjaxRequest) {
        AbstractCasFilter.log("AjaxRedirect url:" + url);
        resp.setContentType("application/json");
        resp.setStatus(200);
        //ajax请求,以流的方式返回前端
        PrintWriter pw = resp.getWriter();
        pw.write("{\"casError\":\"403\",\"redirect\"" + url + "\"}");
    } else {
    //不是ajax请求直接重定向
        AbstractCasFilter.log("NoAjaxRedirect url:" + url);
        resp.sendRedirect(url);
    }
}

你可能感兴趣的:(java,java,javascript,前端)