开发者社区> 问答> 正文

javaweb里如何优雅的处理请求参数 400 请求报错 

如何是正规的表单提交,可以用各种form验证框架,但是如果是一般的请求呢。
比如数字,非空等,是在接收请求的块中用trycatch,并在开始提供默认值?如

void myrequest(){
 int para1 = 1;
 String name = null;
 try{
  para1 = Integer.valueOf(request.getParameter("para1"));
  name = request.getParameter("para1");
 }catch{
} 
 do other...
}
整个方法直接放到trycatch里也不好吧,这样会屏蔽很多其他可能的异常。

有什么好建议吗?

展开
收起
kun坤 2020-05-29 19:23:58 806 0
1 条回答
写回答
取消 提交回答
  • 如果界面传入数据在转换的时候抛出了异常,通常是输入数据错误。一个完整的,经过测试的网站在这种时候往往代表着被攻击了。如果是代码漏洞,你需要给界面非常友好的提示。
    如:para1 = Integer.valueOf(request.getParameter("para1"));如果它抛出了异常,则代表输入非法了,通常页面就会限制这个数据是数字。你需要对这个数据对应的输入框中提示。
    通常后台的判断应该是这样的

    void myrequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		int para1;
    		String name;
    		try {
    			para1 = getInteger(request, "param1", true);
    		} catch (Exception e) {
    			//此处处理过于简单,通常需要针对具体的输入框做提示。完整的异常处理
    			PrintWriter writer = response.getWriter();
    			writer.write(e.getMessage());
    			writer.flush();
    			return;
    		}
    		try{
    			name = getString(request, "name", true);
    		} catch (Exception e) {
    			//此处处理过于简单,通常需要针对具体的输入框做提示。完整的异常处理
    			PrintWriter writer = response.getWriter();
    			writer.write(e.getMessage());
    			writer.flush();
    			return;
    		}
    		//do other
    	}
    
    	private String getString(HttpServletRequest request, String param, boolean isCanNull) throws ValiException {
    		String paramValue = request.getParameter(param);
    		if(StringUtils.isEmpty(paramValue)){
    			if(isCanNull) return null;
    			else throw new ValiException("文本不能为空");//返回异常时,建议在异常中加入一个int类型的code。通过code去判断异常类型。提示文本,应放入到系统常量中
    		}
    		//此处可以依据你的具体业务需求做其他判断
    		return paramValue;
    	}
    
    	private int getInteger(HttpServletRequest request, String param, boolean isCanNull) throws ValiException {
    		String paramValue = request.getParameter(param);
    		if(StringUtils.isEmpty(paramValue)){
    			if(isCanNull) return 0;
    			else throw new ValiException("请输入有效数字");
    		}
    		//此处可以依据你的具体业务需求做其他判断
    		try {
    			return Integer.parseInt(paramValue);
    		} catch (NumberFormatException e) {
    			throw new ValiException("输入数字格式错误", e);
    		}
    	}

    ######回复 @铂金小虫 : 是这个意思,不能所有的都在一个try里面的,那样前一个错误会造成后面的代码都无法执行。对于String/int/double...的处理封装一个通用工具类就行了。工具类中的判断可以在我注释的地方扩展正则表达式等(这里根据你的具体业务需求来)。。。######恩,我也有过这个想法,你这里关键是对每个参数的获取放在独立的try里面吧,然后对于string,int可以放在通用的工具类里。###### 我擦,看到这题目我还以为点到知乎里面去了。。

    表单提交我都是用一个通用的类完成,实例化这个对象之后,添加进验证规则,返回验证结果和相关描述并ajax输出到浏览器

    个人看法,因为前端的js代码非常容易被破解.而且浏览器自带破解工具(Debug...)
    所以,如果是公网的网站,就不要考虑前端验证了.或者说,前端js负责错误提示,不负责验证(这其实是两回事)
    验证主要工作放倒后端来做.后端的做法太多了,单独写类,拦截器,配置文件等等各种奇淫技巧.具体情况具体分析吧.
    如果楼主做的是内网的系统(内网怎么就能降低要求呢摔....)那么可以把验证环节完全放倒前端.后端只接管数据库层面的异常.这样如果验证问题就去前端找.比较方便.前端验证的方法也很多.try catch是一种,正则表达式比try catch 要强大,但是不如try catch用起来方便.具体还是应该具体情况具体分析的吧.

    2020-05-30 14:02:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载