编码转换过滤器

------------------siwuxie095

使用过滤器进行编码转换


Java Web 开发中,经常会遇到乱码的问题,统一字符编码是

解决乱码问题的非常有效的手段

一个简单的编码转换过滤器实例:

使用过滤器对请求中的参数信息进行编码转换

工程结构目录如下:

后端代码:

LoginServlet.java:


package com.siwuxie095.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

// LoginServlet 继承自 HttpServlet

public class LoginServlet extends HttpServlet {

/**

* 用于序列化和反序列化的 ID

*/

private static final
long serialVersionUID = -7740192486028671728L;

//覆盖父类 HttpServlet 的 doGet() 方法

@Override

protected
void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("===== doGet =====");

//在 doGet() 方法里调用 doPost() 方法

//这样,GET请求和POST请求可以共用一套处理逻辑

doPost(req, resp);

}

//覆盖父类 HttpServlet 的 doPost() 方法

@Override

protected
void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("===== doPost =====");

String userName=req.getParameter("uname");

String password=req.getParameter("upwd");

System.out.println("用户名:"+userName);

System.out.println("密码:"+password);

String forward=null;

if (userName.equals("李白")&&password.equals("8888")) {

forward="/success.jsp";

}else {

forward="/error.jsp";

}

RequestDispatcher rd=req.getRequestDispatcher(forward);

rd.forward(req, resp);

}

}

EncodingFilter.java:


package com.siwuxie095.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {

//声明一个成员变量
用来保存当前应用的字符集名称

private String charEncoding=null;

public EncodingFilter() {

}

public
void init(FilterConfig fConfig) throws ServletException {

//在部署描述符中设置该应用的默认字符编码集
在init方法中获取到该设置

charEncoding=fConfig.getInitParameter("encoding");

//如果字符编码的名称没有设置
就抛出一个异常

if (charEncoding==null) {

throw new ServletException("EncodingFilter中的编码设置为空!!!");

}

}

public
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

//如果当前应用的默认编码,与请求中的编码值不一致

if (!charEncoding.equals(request.getCharacterEncoding())) {

//那么就将请求中的编码设置成当前默认的编码设置

request.setCharacterEncoding(charEncoding);

}

//将响应的编码设置也改成当前默认的编码设置

response.setCharacterEncoding(charEncoding);

chain.doFilter(request, response);

}

public
void destroy() {

}

}

前端代码:

login.jsp:


<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8">

<title>登录页面</title>

<script
type="text/javascript">

function check(form){

if(document.forms.loginForm.uname.value==""){

alert("请输入用户名!");

document.forms.loginForm.uname.focus();

return false;

}

if(document.forms.loginForm.upwd.value==""){

alert("请输入密码!");

document.forms.loginForm.upwd.focus();

return false;

}

}

</script>

<style type="text/css">

body {

color: #000; font-size =14px;

margin: 20px, auto;

}

</style>

</head>

<body>

<!-- 添加表单,url在部署描述符中进行配置,使用post方式来提交 -->

<form
action="<%= request.getContextPath() %>/loginServlet"
method="post"
name="loginForm">

<table
border="1"
cellspacing="0"
cellpadding="5"
bordercolor="silver"
align="center">

<tr>

<td
colspan="2"
align="center"
bgcolor="#E8E8E8">用户登录</td>

</tr>

<tr>

<td>用户名:</td>

<td><input
type="text"
name="uname"
/></td>

</tr>

<tr>

<td>密码:</td>

<td><input
type="password"
name="upwd"
/></td>

</tr>

<tr>

<td
colspan="2"
align="center">

<input
type="submit"
name="submit"
onclick="return check(this);"
/>

<input
type="reset"
name="reset"
/>

</td>

</tr>

</table>

</form>

</body>

</html>

success.jsp:


<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8">

<title>登录成功提示页面</title>

<style type="text/css">

body {

color: #000; font-size =14px;

margin: 20px, auto;

}

#message {

text-align: center;

}

</style>

</head>

<body>

<div
id="message">

登录成功!<br/>

您提交的信息为:<br/>

用户名:<%= request.getParameter("uname") %><br/>

密码:<%= request.getParameter("upwd") %><br/>

<a
href="<%= request.getContextPath() %>/login.jsp">返回登录页面</a>

</div>

</body>

</html>

error.jsp:


<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8">

<title>登录失败提示页面</title>

<style type="text/css">

body {

color: #000; font-size =14px;

margin: 20px, auto;

}

#message {

text-align: center;

}

</style>

</head>

<body>

<div
id="message">

登录失败!<br/>

您提交的信息为:<br/>

用户名:<%= request.getParameter("uname") %><br/>

密码:<%= request.getParameter("upwd") %><br/>

<a
href="<%= request.getContextPath() %>/login.jsp">返回登录页面</a>

</div>

</body>

</html>

在部署描述符
web.xml 中注册 servlet 和 filter:


<?xml
version="1.0"
encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

<display-name>MyFilter</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<servlet>

<servlet-name>LoginServlet</servlet-name>

<servlet-class>com.siwuxie095.servlet.LoginServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>LoginServlet</servlet-name>

<url-pattern>/loginServlet</url-pattern>

</servlet-mapping>

<filter>

<filter-name>EncodingFilter</filter-name>

<filter-class>com.siwuxie095.filter.EncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>EncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>

部署描述符
web.xml 在 WEB-INF 目录下,如果没有,手动创建即可

选择工程
MyFilter,右键->Java EE Tools->Generate Deployment Descriptor Stub

访问:localhost:8080/MyFilter/login.jsp,分别输入 李白 和 8888

跳转到:localhost:8080/MyFilter/loginServlet,登录成功

如果没有
编码转换过滤器,则会乱码,且登录失败

【made by siwuxie095】

时间: 2024-10-18 09:01:17

编码转换过滤器的相关文章

使用java进行文件编码转换

在开发过程中,可能会遇到文件编码的转换,尽管说开发工具eclipse能够转换编码,可是有的情况却非常不方便.比方,原来文件本身的编码是GBK,如今要转换成UTF-8,假设直接在eclipse中把文件编码改动成UTF-8,恭喜你,是乱码,由于不能直接从GBK到UTF-8进行转换,这时就须要我们手动的来转换编码.以下是一个文件编码转换的工具类. package com.mikan.stuff; import java.io.File; import java.io.FileInputStream;

关于raw_input输入中文时的编码转换

今日在敲代码时出现了如下问题 中文的编码出现了问题(在键盘输入中文时也会出现同样的问题),中文的编码应该是utf-8编码格式,有以下两种方式来进行编码转换: (1)decode用法:str  -> decode('the_coding_of_str') -> unicode 即写为格式:raw_input('净利润为:'.decode('utf-8').encode('gbk')) (2)encode用法:unicode -> encode('the_coding_you_want')

Linux下查看文件编码,文件编码格式转换和文件名编码转换

linux相关   2008-10-07 10:46   阅读1392   评论0   字号: 大大  中中  小小  如果你需要在Linux中 操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是 UTF-8.下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换. 查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set file

关于JS的编码转换问题

在进行JS开发过程中,尤其是在开发报表时,报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号或乱码等等一系列不能正常显示的情况. 这是由于浏览器和报表服务器的编码不同,字符多次进行编码转换时出现错误导致字符的显示出现乱码,尤其是中日韩文和特殊字符更容易出现乱码问题. 以开发报表软件FineReport为例,在给报表服务器发送请求之前,对URL或者只对URL里面的参数名字和参数值,进行cjkEncode的编码,该方式兼容了各种不同的字符集,如IS

Nim-字符串编码转换

Nim中对字符串进行转码需要用到encodings模块. encodings模块: proc getCurrentEncoding():string {.raises: [],tags: [].} #检索当前系统编码,在UNIX上,总是返回"UTF-8". proc open(destEncoding = "UTF-8"; srcEncoding = "CP1252"): EncodingConverter {. raises: [Overflo

gbk转utf-8 iconv 编码转换

linux下面有时候 字符需要进行编码转换(爬虫将gbk转为utf-8编码...),一般可以选择iconv函数. 终端下面  输入 man 3 iconv 得到  iconv函数的使用方法. 个人看习惯了,msdn文档之后感觉linux下面的文档的看的不是那么爽了. 使用iconv函数进行转码,一般使用三个函数:iconv_open  . iconv  .iconv_close三个函数. iconv_t iconv_open(const char* tocode,const char* from

Windows下字符编码转换

有时候经常使用别人用Tabhost+其它的实现demo.单纯利用Tabhost该如何使用呢? 下面看例子: public class MainActivity extends TabActivity { public TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取对象 tabHost = getTabH

〖Python〗-- 编码转换

[字符编码与转码] 为什么要进行编码和转码 由于每个国家电脑的字符编码格式不统一(列中国:GBK),同一款软件放到不同国家的电脑上会出现乱码的情况,出现这种情况如何解决呢?! 当然由于所有国家的电脑都支持Unicode万国码,那么我们可以把Unicode为跳板,先把字符编码转换为Unicode,在把Unicode转换为另一个国家的字符编码(例韩国),则不会出现乱码的情况.当然这里只是转编码集并不是翻译成韩文不要弄混了. Python3.0进行编码转换 # __author__:"ShengXin

golang编码转换

在网上搜索golang编码转化时,我们经常看到的文章是使用下面一些第三方库: https://github.com/djimenez/iconv-go https://github.com/qiniu/iconv 如果我们在windows下使用这个库,会看到错误: iconv.go:6:20: fatal error: iconv.h: No such file or directory compilation terminated. 这是因为需要系统有 iconv.h 文件. linux.ma