在web中当页面的编码格式和服务器的编码格式不一样时,向服务器传递中文就会出现乱码,那么如何解决呢?这里要分get请求和post请求,对于这两种不同的请求有不同的处理处理方式,处理方式如下:
1.post请求
post请求处理中文乱码相对简单,只需要在doPost()方法中设置请求的编码格式就行了,因为post请求的参数在请求体中。处理方式如下:
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("utf-8");
response.setContentType("txt/html;charset=utf-8")
}
2.get请求
get请求不能像上面post那样来处理中文乱码问题,因为get请求的参数url地址栏中,那么此时就要使用getBytes(String s)方法对接收到的参数进行反编码,得到服务器编码的字节码,再调用new String(byte[] bytes,String s)获得编码后的字符串。处理方法如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
byte[] bytes = name.getBytes("ISO-8859-1");
String value = new String(bytes,"utf-8");
......
}
说完了get请求和post请求两种请求处理中文乱码的方法,那么接下来说下如何把这两种处理方法引入到Filter中。我们不可能为每个请求都对其做中文乱码处理,那样会出现太多的代码冗余,此时就可以用过滤器来做,先让每个请求达到Servlet之前,先被过滤器拦截,等过滤器处理完之后再调用其chain.doFilter(request,response)方法对此请求放行,那么此时到达Servlet的每个请求都被处理过了,就不用考虑中文乱码问题了。对于get请求怎样拿到每次请求的参数名呢?这里需要重写request的getParameters(String name)方法,处理方法如下:
public class MyRealRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public MyRealRequest(HttpServletRequest req) {
super(req);
request = req;
}
@Override
public String getParameter(String name) {
String value = request.getParameter(name);
try {
byte[] bytes = value.getBytes("ISO-8859-1");
value = new String(bytes,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}
}
有了这个类,我们就可以用它来处理get请求的中文乱码问题,在Filter中处理方法如下:
public class CharacterFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String method = req.getMethod();
if(method.equals("POST")){
req.setCharacterEncoding("utf-8");
res.setContentType("text/html;charset=utf-8");
chain.doFilter(req, res);
}else if(method.equals("GET")){
MyRealRequest realRequest = new MyRealRequest(req);
res.setContentType("text/html;charset=utf-8");
chain.doFilter(realRequest, res);
}
}
public void destroy() {}
}
通过以上的处理中文乱码的问题就解决了,那么接下就需要配置Filter,使它对每个请求都运用这个操作。配置方法如下:
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>com.web.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
到此,使用Filter处理中文乱码的问题就说完了。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。