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

我在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 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 parameterMap = getParameterMap();

String [] values=parameterMap.get(name);

if(values==null){

return null;

}

return values[0];

}

@Override

public String[] getParameterValues(String name) {

@SuppressWarnings("unchecked")

Map parameterMap = getParameterMap();

String[] values = parameterMap.get(name);

return values;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值