request请求参数校验(十二)

本文介绍了Java Web项目中常见的中文乱码问题及解决方法,包括数据非空校验、正则规则校验、编解码过程代码示例、Tomcat配置、逆向编码解码还原法等多种方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 数据的非空校验

在得到请求参数后,需要对数据进行校验,这是服务器端校验,通过java代码实现。在实际开发中,客户端校验(JavaScript实现),和服务器端校验都要有。

拿到的都是字符串,做非空校验:String.trim().length()>0,trim去除左右两边空格,一定要记住,实际开发中,得到数据一定要trim

规则校验:正则进行规则校验。

二、处理中文乱码

1. 乱码出现的原因:汉字在各个编码表中的码值不一样。

2. 程序出现乱码的原因。在Tomcat8以前,页面使用utf-8编码方式和Tomcat使用的ISO8859-1解码方式不一致,request获取的信息就是乱码。

编解码过程代码如下:

package com.it.test;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;


public class Demo {
	public static void main(String[] args) throws UnsupportedEncodingException {
		/*使用URL进行编解码*/
		System.out.println("========URL实现编解码==========");
		String s = "中国";
		String code = URLEncoder.encode(s, "utf-8");
		//tomcat进行了如下操作
		String result = URLDecoder.decode(code, "iso8859-1");//解码
		//得到正确信息
		//1.使用iso8859-1进行编码
		String code2 = URLEncoder.encode(result, "iso8859-1");
		String right = URLDecoder.decode(code2, "utf-8");
		System.out.println(right);
		System.out.println("=========string类内中实现编解码============");
		fun1();
	}
	
	//在string类中就可以直接进行编码解码
	public static void fun1() throws UnsupportedEncodingException {
		String origin = "北京";
		byte[] code = origin.getBytes("utf-8");
		String wrongMsg = new String(code, "iso8859-1");
		String rightMsg = new String(wrongMsg.getBytes("iso8859-1"),"utf-8");
		System.out.println(rightMsg);
	}
}

3.解决方案:

post和get请求都可以的方式:

将得到的信息使用ISO8859-1进行编码 msg.getBytes("iso8859-1");

在使用utf-8进行解码 new String(msg.getBytes("iso8859-1"),"utf-8");

                //获得用户名:
		String username = request.getParameter("username");//参数要与JSP中的name值对应。
		
		//在Tomcat7及其以下的版本,中文会出现乱码,解决方案如下:
		//String right = new String(username.getBytes("iso8859-1"),"utf-8");

只有post请求可以使用的方式如下:

如果请求方式是post,我们可以通过request.setCharacterEncoding(String charsetname);


		//post请求
		request.setCharacterEncoding("utf-8");
		//获得用户名:
		String username = request.getParameter("username");//参数要与JSP中的name值对应。
		
		//在Tomcat7及其以下的版本,中文会出现乱码,解决方案如下:
		//String right = new String(username.getBytes("iso8859-1"),"utf-8");
		System.out.println(username);

三、处理中文乱码所有方案总结

1、对Tomcat和eclipse配置文件进行配置

第一步:对Tomcat_HOME/conf/server.xml文件进行配置
核心代码如下(其中最后一句是自己加的):

<Connector executor="tomcatThreadPool"
        port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443"
        URIEncoding="UTF-8" />
 -->

第二步:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

修改为:

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

<Connector URIEncoding="UTF-8" allowTrace="false" connectionTimeout="2000" maxKeepAliveRequests="1" maxThreads="200" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

加上 URIEncoding="UTF-8"

这种方式一般不建议使用,因为它修改的是Tomcat平台的编码,如果人为修改会影响其他项目的运行。

2、逆向编码解码还原法 
之所以会出现乱码,是因为浏览器将中文以utf-8的编码格式传给tomcat时,tomcat以默认的iso8859-1方式对其解码,而编解码格式不一致,故而出现乱码。根据这个原理可逆向还原。 
如:

byte buf[] = request.getParameter("name").getBytes("iso8859-1");
String name = new String(buf,"GBK");

这样得到的name便是前台传来的正确的中文参数了 
这种方式比较偏向底层,而且有一个弊端,就是当浏览器传送的中文参数很多时,需要一个个设置,比较罗嗦,不利于节省时间。

3、将浏览器的表单的提交方式设为post方式,同时在servlet里在接受参数前将request的编码设置为GBK或者UTF-8。 
前台形如:

<form action="login.jsp" method="post">
    用户名:<input type="text" name="name"><br/><br/>
    密    码:<input type="text" name="pwd"><br/><br/>
    <input type="submit" value="登录">
</form>

后台形如:

request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");

这样也能正确地接受中文参数了。当然,这种方式也存在弊端,试想下当项目发布后,如果需要修改编码为GBK,则要修改源代码,而对客户而言,这需要反编译等步骤直接修改代码,有点困难。

4、通过web项目的WebRoot/WEB-INF/web.xml文件进行配置参数,同时可在servlet中进行读取。 
web.xml的示例核心代码如下:

<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>cn.hncu.servlets.LoginServlet</servlet-class>
    <init-param>
        <param-name>character</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</servlet>

servlet示例核心代码如下:

public void init(ServletConfig config) throws ServletException {
    String charset = config.getInitParameter("character");
    System.out.println(charset);
}

这种方法弥补了方法3的缺陷,方便后期维护和修改,用户修改时不需要改源代码,只需修改web.xml即可。

参考资料:

https://blog.youkuaiyun.com/lengjinghk/article/details/51938644

https://blog.youkuaiyun.com/Night_alone/article/details/76644023

 

 

 

在 Spring Boot 中,可以使用 Hibernate Validator 来进行请求参数校验。具体步骤如下: 1. 引入 Hibernate Validator 依赖: ```xml <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency> ``` 2. 在需要校验请求参数实体类中添加校验注解,例如: ```java public class User { @NotBlank(message = "用户名不能为空") private String username; @NotBlank(message = "密码不能为空") private String password; @Email(message = "邮箱格式不正确") private String email; // 省略 getter 和 setter 方法 } ``` 3. 在请求处理方法中添加 @Validated 注解,并在参数上添加 @Valid 注解,例如: ```java @RestController @RequestMapping("/user") @Validated public class UserController { @PostMapping("/login") public Result login(@RequestBody @Valid User user) { // 处理登录逻辑 } } ``` 4. 当请求参数不符合校验规则时,会抛出 ConstraintViolationException 异常。可以在全局异常处理器中对该异常进行处理,例如: ```java @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) public Result handleConstraintViolationException(ConstraintViolationException e) { List<String> errorMessages = e.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); return Result.error(String.join(",", errorMessages)); } } ``` 这样就可以自定义请求参数校验了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值