热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java过滤器案例_Javaweb之Filter案例练习项目全局编码过滤器

Filter全局编码过滤器这篇来做一个Filter在全局编码过滤器练习,这篇新建一个web项目来做练习。web项目创建先创建一个叫GlobalFilter的web动态

Filter全局编码过滤器

这篇来做一个Filter在全局编码过滤器练习,这篇新建一个web项目来做练习。

web项目创建

先创建一个叫GlobalFilter的web动态项目,把前面文章出现过的login.jsp复制过来,改成如下代码。

pageEncoding="UTF-8"%>

Insert title here

用户名:

因为我们这里做全局编码的练习,到时候登录页面输入用户名,我们会采用中文字符输入。

Servlet创建

因为这里我们是模拟全局,实际中应该有许多servlet和许多前端页面,例如注册,登录,首页搜索等。我们就来创建一个servlet来模拟下就好。创建一个LoginServlet.java。 url-pattern是/web/loginServlet。

package com.kaigejava.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet("/loginServlet")

public class LoginServlet extends HttpServlet {

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

//request.setCharacterEncoding("UTF-8");

String name = request.getParameter("username");

System.out.println(name);

}

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

doGet(request, response);

}

}

以前,我们是通过这个红圈代码来设置编码,这样拿到中文的username就不会是乱码。

86717fcf1f62b813bc5fb9178ac636bd.png

现实开发中有很多个servlet,如果都这样写这行代码来设置编码,这行代码就冗余,我们可以把这行代码放到Filter过滤器中去。

Filter类创建

创建一个MyFilter.java 实现Filter接口,代码如下。

package com.kaigejava.web.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;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

public class MyFilter implements Filter {

public void destroy() {

// TODO Auto-generated method stub

}

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

// 转换对象

HttpServletRequest req = (HttpServletRequest) request;

// 设置编码

req.setCharacterEncoding("UTF-8");

// 放行

chain.doFilter(request, response);

}

public void init(FilterConfig fConfig) throws ServletException {

// TODO Auto-generated method stub

}

}

web.xml内容如下

GlobalFilter

index.html

index.htm

index.jsp

default.html

default.htm

default.jsp

MyFilter

com.kaigejava.web.filter.MyFilter

MyFilter

/*

LoginServlet

com.anthony.web.servlet.LoginServlet

LoginServlet

/web/loginServlet

部署测试

现在部署到tomcat然后测试以下,前台页面用户名输入框输入“张三”看看。

244ae428dfebedb177f7c934fa2d5555.png

在Eclipse控制台可以看到“张三”打印出来不乱码,说明我们Filter中编码设置起效果了。

8071615c44a53865ed6c53d4a94f9a97.png

Get方式提交表单问题

在login.jsp中我们表单提交是post方法,如果改成get呢,会出问题。

d9a2d19437f7b3eb9ac977baa793e045.png

重新部署,再来测试下

0b1c8adaa1eea877be11cfd06304811d.png

7e4fdd2ca2afaa00bc1166827b9152a7.png

如果是get方式传过来,中文就很有可能显示乱码。这个问题怎么解决了,有两种方式解决,第一种不要写get,就是post表单提交。现在我们来看看第二种方式如何解决。在MyFilter类中写一个通用的方法,既能解决get也能解决post的编码问题。

装饰模式解决get和post编码问题

我们在MyFilter.java代码中添加一个MyRequest class,里面写我们的装饰器代码,只重写了getParameter(String text)方法。

package com.kaigejava.web.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

public class MyFilter implements Filter {

public void destroy() {

// TODO Auto-generated method stub

}

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

// 转换对象

HttpServletRequest req = (HttpServletRequest) request;

// 设置编码

//req.setCharacterEncoding("UTF-8");

// 放行

req = new MyRequest(req);

// req这个对象是包装之后的对象,把这个传到servlet中的request

chain.doFilter(req, response);

}

public void init(FilterConfig fConfig) throws ServletException {

// TODO Auto-generated method stub

}

}

/**

* 继承HttpServlet的包装类,实现装饰模式,解决get和post乱码问题

*

*/

class MyRequest extends HttpServletRequestWrapper{

HttpServletRequest request;

public MyRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

public String getParameter(String name) {

name = request.getParameter(name); //乱码

try {

return new String(name.getBytes("iso-8859-1"), "UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return null;

}

}

部署到tomcat,login.jsp表单还是get提交,测试可以解决get和post乱码。

重写其他方法

在request对象中,还有其他方法,例如getParameters() 和getParameterMap(),这里我们把这两个方法都重写一下。

package com.kaigejava.web.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.Map;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

public class MyFilter implements Filter {

public void destroy() {

}

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

// 转换对象

HttpServletRequest req = (HttpServletRequest) request;

// 放行

req = new MyRequest(req);

// req变成自己包装的对象,然后传递给servlet中,servlet中的request就是调用包装过的req

chain.doFilter(req, response);

}

public void init(FilterConfig fConfig) throws ServletException {

}

}

/**

* 继承HttpServlet的包装类,实现装饰模式,解决get和post乱码问题

*

*/

class MyRequest extends HttpServletRequestWrapper {

HttpServletRequest request;

public MyRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

/*@Override

public String getParameter(String name) {

name = request.getParameter(name); //乱码

try {

return new String(name.getBytes("iso-8859-1"), "UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return null;

}*/

@Override

public String getParameter(String name) {

Map map = getParameterMap();

return map.get(name)[0];

}

@Override

public String[] getParameterValues(String name) {

Map map = getParameterMap();

return map.get(name);

}

public boolean flag = true;

@Override

public Map getParameterMap() {

Map map = request.getParameterMap(); // 乱码

if (flag) {

for (Map.Entry m : map.entrySet()) {

String[] values = m.getValue();

for (int i = 0; i

try {

values[i] = new String(values[i].getBytes("iso-8859-1"), "UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

}

flag = false;

}

return map;

}

}

由于最后三个方法,我们倒数第二个第三个都是调用倒数第一个,为了解决第一个调用乱码好了,第二个再次调用又变成乱码,所以这里在第三个方法添加了一个flag。



推荐阅读
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 微信小程序:授权登录与手机号绑定
    本文详细介绍了微信小程序中用户授权登录及绑定手机号的流程,结合官方指引和实际开发经验,提供了一套完整的实现方案,帮助开发者更好地理解和应用。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
author-avatar
左文欣936
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有