首页 新闻 会员 周边 捐助

过滤器解决JavaWeb里面的中文乱码问题为什么失效?

0
悬赏园豆:50 [已解决问题] 解决于 2016-01-21 16:41

     我在javaWeb项目里面的src目录下定义了一个Filter过滤器,用来解决中文乱码问题,又定义了一个类实现HttpServletRequestWrapper接口来实现request得到请求参数的方法的各种增强。但是却实现不了.

  气人的是,我的一个测试类用post和get提交都可以解决中文乱码,但是唯独login.servlet不行。断点跟进去发现,过滤器处理的时候,要么找不到增强request方法的类,要么就走一些底层我看不懂的代码。我很无语,跪求大神指教。

  Loginservlet.java

  

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Ajax响应输出对象out
PrintWriter out = response.getWriter();
// 用户提交的表单
String username = new String(request.getParameter("username").getBytes("ISO8859-1"));
int password = Integer.parseInt(request.getParameter("password"));
String code = request.getParameter("code");
String autologin = request.getParameter("autologin");
// 得到自动生成的验证的正确值
HttpSession session = request.getSession();
String buffer = (String) session.getAttribute("buffer");
UserBiz ub = new UserBizImpl();
User user = ub.selectByName(username);
// 判断用户是否找到
if (user == null) {
out.print("用户名不正确");
} else if (user.getPassword() != password) {
out.print("密码不正确");
} else if (!code.equalsIgnoreCase(buffer)) {
out.print("验证码不正确");
} else {
// 用户输入信息都正确
if (autologin.equals("true")) {
// 用户选中了自动登陆
Cookie cookie = new Cookie("autologin", username + "&"
+ password);
// 设置Cookie时间限制
cookie.setMaxAge(60 * 60 * 24 * 30);
// 将Cookie回写到浏览器
response.addCookie(cookie);
}
session.setAttribute("user", user);
response.sendRedirect("main.jsp");
}
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

 

编码过滤器

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 父类对象强制转换为子类对象
HttpServletRequest req = (HttpServletRequest) request;
// 增强request方法
// 读取配置中的charset信息
String charset = req.getSession().getServletContext()
.getInitParameter("charset");
// 转码操作
if (charset == null || charset.isEmpty()) {
charset="UTF-8";
}
try {
//HttpServletRequest encodingRequest = new EncodingRequest(req, charset);
HttpServletRequest encodingRequest=new EncodingRequest(req,charset);
response.setContentType("text/html;charset="+charset);
// 放行
chain.doFilter(encodingRequest, response);
} catch (Exception e) {
e.printStackTrace();
System.out.println("通用过滤器没有转码!");
}
//增强类和过滤器写完,接下来是配置信息和测试类
}

 

增强request的类

private HttpServletRequest request;
private boolean hasEncode; // 用来判断是否已经实现转码,避免重复的转码
private String charset; // 读取Filter配置中的字符编码,默认为UTF-8(Filter中逻辑控制)

public EncodingRequest(HttpServletRequest request, String charset) {
super(request);
this.request = request;// F2+enter快速补全
this.charset = charset;
}

// alt+shift+s快速选中要重写的方法。
// 在此类中,实现了三个方法的转码。但是通过方法的调用,写一个方法的转码,然后其他的方法调用就可以了。
// 当然,为了实现所有方法的转码,我们需要实现一个方法最复杂的getParameterMap()方法的转码。

@SuppressWarnings("rawtypes")
@Override
public Map getParameterMap() {
// 先获得过滤器中的请求方式
String method = request.getMethod();
// 分Post和Get方法进行分类转码
if (method.equalsIgnoreCase("post")) {// 忽略大小写
// post请求
try {
request.setCharacterEncoding(charset);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
// 得到未转码之前的map,一个一个转码
@SuppressWarnings("unchecked")
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) {// 确保get编码转换只执行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
values[i] = new String(
values[i].getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}

@Override
public String getParameter(String name) {
@SuppressWarnings("unchecked")
Map<String, String[]> parameterMap = getParameterMap();
String [] values=parameterMap.get(name);
if(values==null){
return null;
}
return values[0];
}

@Override
public String[] getParameterValues(String name) {
@SuppressWarnings("unchecked")
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}

博智星的主页 博智星 | 初学一级 | 园豆:175
提问于:2015-10-16 23:43
< >
分享
最佳答案
0

在Filter里doFilter写:

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

这样解决不了你的问题?0.0

收获园豆:50
之奇一昂 | 小虾三级 |园豆:1421 | 2015-10-17 08:21

不能的,你的这个只能解决post方法的乱码,对get无效的

博智星 | 园豆:175 (初学一级) | 2015-10-17 15:50

@博智星: 

之奇一昂 | 园豆:1421 (小虾三级) | 2015-10-18 09:31

@之奇一昂: 亲,是中文!!

博智星 | 园豆:175 (初学一级) | 2015-10-19 19:18

@博智星: 嗯?红红火火愰愰惚惚的“测试”两个字是韩文吗?URL里面%E6%B5%8B%E8%AF%95就是中文“测试”啊,你想要什么样的中文?http://tool.oschina.net/encode?type=4

之奇一昂 | 园豆:1421 (小虾三级) | 2015-10-20 07:55
其他回答(1)
0

服务器环境问题

博智星 | 园豆:175 (初学一级) | 2016-01-21 16:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册