首页 > 学院 > 开发设计 > 正文

java利用过滤器实现编码的转换,内容输出的替换

2019-11-14 14:59:51
字体:
来源:转载
供稿:网友

在页面建个表单

 <form action="login.do" method="post">        <input type="text" name="username" />        <input type="submit" value="确定" />    </form>

建个servlet

web.xml

  <servlet>    <servlet-name>LoginServlert</servlet-name>    <servlet-class>servlet.LoginServlert</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>LoginServlert</servlet-name>    <url-pattern>/login.do</url-pattern>  </servlet-mapping>
package servlet;import java.io.IOException;import java.io.PRintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlert extends HttpServlet {    public LoginServlert() {        super();    }    public void destroy() {        super.destroy();     }    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String username = request.getParameter("username");        System.out.println("获取的username:>>>>>>"+username);    }    public void init() throws ServletException {    }}

后台情况是这样的:

乱码了.

可以通过过滤器来解决

新建一个过滤器EncodingFilter.java

package 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.http.HttpServletRequest;public class EncodingFilter implements Filter{    private String encoding = "";    private String filterName = "";    public void init(FilterConfig filterConfig) throws ServletException {        encoding = filterConfig.getInitParameter("encoding");        filterName = filterConfig.getFilterName();        if (encoding == null || "".equals(encoding)) {            encoding = "UTF-8";        }        System.out.println("获得编码值......");    }    public void doFilter(ServletRequest request, ServletResponse res,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest req=(HttpServletRequest)request;        System.out.println("请求被" + filterName + "过滤了.......");        // 分别对请求和响应进行编码设置        request.setCharacterEncoding(encoding);                res.setCharacterEncoding(encoding);        chain.doFilter(req, res);        System.out.println("响应被被" + filterName + "过滤了.......");    }    public void destroy() {        System.out.println("请求被销毁......");    }}

在web.xml中配置filter

   <filter>      <filter-name>EncodingFilter</filter-name>      <filter-class>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>*.do</url-pattern>  </filter-mapping> 

跑起来:

正常了.

我们换在地址栏里输入汉字,看看是否乱码.

结果是这样的

过滤器不起作用了,怎么办.

其实request.setCharacterEncoding(encoding);只对消息体中的数据起作用,对url中的参数不起作用了.

对上面的过滤器进行优化.

编写RequestEncodingWrapper.java

package filter;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class RequestEncodingWrapper extends HttpServletRequestWrapper {    private String encoding = "";    public RequestEncodingWrapper(HttpServletRequest request) {        // 必须调用父类构造方法        super(request);    }    public RequestEncodingWrapper(HttpServletRequest request,String encoding){        // 必须调用父类构造方法        super(request);        this.encoding=encoding;    }        @Override    public String getParameter(String name) {        String value=getRequest().getParameter(name);        try {            //将参数值进行编码转换            if(value!=null&&!"".equals(value)){                value=new String(value.trim().getBytes("iso-8859-1"),encoding);            }        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }                return value;    }        }

优化EncodingFilter.java后

package 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.http.HttpServletRequest;public class EncodingFilter implements Filter {    private String encoding = "";    private String filterName = "";    public void init(FilterConfig filterConfig) throws ServletException {        encoding = filterConfig.getInitParameter("encoding");        filterName = filterConfig.getFilterName();        if (encoding == null || "".equals(encoding)) {            encoding = "UTF-8";        }        System.out.println("获得编码值......");    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest req=(HttpServletRequest)request;        System.out.println("请求被" + filterName + "过滤了.......");        if("GET".equals(req.getMethod())){            req=new RequestEncodingWrapper(req,encoding);                    }else {            request.setCharacterEncoding(encoding);        }        // 分别对请求和响应进行编码设置        response.setCharacterEncoding(encoding);        chain.doFilter(req, response);        System.out.println("响应被被" + filterName + "过滤了.......");    }    public void destroy() {        System.out.println("请求被销毁......");    }}

好了.

Filter接口有三个方法:

init(FilterConfig filterConfig) 初始化过滤器,filterConfig参数可以得到过滤器初始化的配置参数信息.

doFilter(ServletRequest request, ServletResponse res,FilterChain chain)

request表示客户端的请求,rewponse表示对应请求的响应,chain是过滤器对象,.在该方法中的特定过滤器完成后,

可调用doFilter请求传给过滤器中的下一个过滤器,也可以直接返回响应内容,还可以将目标重定向.

destroy():释放过滤器中使用的资源.

参数FilterConfig filterConfig有四个方法:

public String getFilterName()    得到过滤器的名字

public String getInitParameter(String name)    得到过滤器中初始化的参数值.

publi Enumeration getInitParameterNames()    得到过滤器配置中的所有初始化参数名字的枚举类型.

publi ServletContext getServlet()    得到Servlet上下文对象.

 说完了请求,我们再来说说响应.

我们经常需要在向浏览器输出内容时,过滤一些敏感词汇.

新建一个内容替换的封装器ResponseReplaeWrapper.java

package filter;import java.io.CharArrayWriter;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class ResponseReplaeWrapper extends HttpServletResponseWrapper {    private CharArrayWriter charWriter = new CharArrayWriter();    public ResponseReplaeWrapper(HttpServletResponse response){        //必须调用父类构造方法        super(response);    }    public PrintWriter getWriter() throws IOException{        //返回字符数组Writer,缓存内容        return new PrintWriter(charWriter);    }    public CharArrayWriter getCharWriter(){        return charWriter;    }        }

过滤器:

package filter;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintWriter;import java.util.Properties;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.HttpServletResponse;public class ReplaceFilter implements Filter {    private Properties propert = new Properties();    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("ReplaceFilter  init.....");        // 通过filterConfig获得初始胡文件名        String filePath = filterConfig.getInitParameter("filePath");        try {            // 导入资源文件            propert.load(ReplaceFilter.class.getClassLoader()                    .getResourceAsStream(filePath));        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        HttpServletResponse res = (HttpServletResponse) response;        // 实例化响应器包装类        ResponseReplaeWrapper resp = new ResponseReplaeWrapper(res);        chain.doFilter(request, resp);        // 缓存输出字符        String outString = resp.getCharWriter().toString();        // 循环替换不合法的字符        for (Object o : propert.keySet()) {            String key = (String) o;            outString = outString.replace(key, propert.getProperty(key));        }        // 利用原先的HttpServletResponse输出字符        PrintWriter out = res.getWriter();        out.write(outString);    }    public void destroy() {        System.out.println("ReplaceFilter destroy......");    }}

在web.xml中配置过滤器

<filter>      <filter-name>ReplaceFilter</filter-name>      <filter-class>filter.ReplaceFilter</filter-class>      <init-param>          <param-name>filePath</param-name>          <param-value>/replace_ZH.properties</param-value>      </init-param>  </filter>  <filter-mapping>      <filter-name>ReplaceFilter</filter-name>      <url-pattern>*.do</url-pattern>  </filter-mapping> 

在src下新建配置文件replace_ZH.properties

建个测试的servlet

package servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ResponseServlet extends HttpServlet {    public ResponseServlet() {        super();    }    public void destroy() {        super.destroy(); // Just puts "destroy" string in log        // Put your code here    }    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("思思博士<br/>色情<br/>赌博<br/>dfdffddf");        /*out.print("    This is ");        out.print(this.getClass());        out.println(", using the GET method");*/        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.print("    This is ");        out.print(this.getClass());        out.println(", using the POST method");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    public void init() throws ServletException {    }}

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表