我在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;
}
在Filter里doFilter写:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
这样解决不了你的问题?0.0
不能的,你的这个只能解决post方法的乱码,对get无效的
@博智星:
@之奇一昂: 亲,是中文!!
@博智星: 嗯?红红火火愰愰惚惚的“测试”两个字是韩文吗?URL里面%E6%B5%8B%E8%AF%95就是中文“测试”啊,你想要什么样的中文?http://tool.oschina.net/encode?type=4
服务器环境问题