国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

java利用過濾器實現(xiàn)編碼的轉(zhuǎn)換,內(nèi)容輸出的替換

2019-11-14 14:59:51
字體:
供稿:網(wǎng)友

在頁面建個表單

 <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 + "過濾了.......");        // 分別對請求和響應(yīng)進行編碼設(shè)置        request.setCharacterEncoding(encoding);                res.setCharacterEncoding(encoding);        chain.doFilter(req, res);        System.out.println("響應(yīng)被被" + 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> 

跑起來:

正常了.

我們換在地址欄里輸入漢字,看看是否亂碼.

結(jié)果是這樣的

過濾器不起作用了,怎么辦.

其實request.setCharacterEncoding(encoding);只對消息體中的數(shù)據(jù)起作用,對url中的參數(shù)不起作用了.

對上面的過濾器進行優(yōu)化.

編寫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) {        // 必須調(diào)用父類構(gòu)造方法        super(request);    }    public RequestEncodingWrapper(HttpServletRequest request,String encoding){        // 必須調(diào)用父類構(gòu)造方法        super(request);        this.encoding=encoding;    }        @Override    public String getParameter(String name) {        String value=getRequest().getParameter(name);        try {            //將參數(shù)值進行編碼轉(zhuǎn)換            if(value!=null&&!"".equals(value)){                value=new String(value.trim().getBytes("iso-8859-1"),encoding);            }        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }                return value;    }        }

優(yōu)化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);        }        // 分別對請求和響應(yīng)進行編碼設(shè)置        response.setCharacterEncoding(encoding);        chain.doFilter(req, response);        System.out.println("響應(yīng)被被" + filterName + "過濾了.......");    }    public void destroy() {        System.out.println("請求被銷毀......");    }}

好了.

Filter接口有三個方法:

init(FilterConfig filterConfig) 初始化過濾器,filterConfig參數(shù)可以得到過濾器初始化的配置參數(shù)信息.

doFilter(ServletRequest request, ServletResponse res,FilterChain chain)

request表示客戶端的請求,rewponse表示對應(yīng)請求的響應(yīng),chain是過濾器對象,.在該方法中的特定過濾器完成后,

可調(diào)用doFilter請求傳給過濾器中的下一個過濾器,也可以直接返回響應(yīng)內(nèi)容,還可以將目標(biāo)重定向.

destroy():釋放過濾器中使用的資源.

參數(shù)FilterConfig filterConfig有四個方法:

public String getFilterName()    得到過濾器的名字

public String getInitParameter(String name)    得到過濾器中初始化的參數(shù)值.

publi Enumeration getInitParameterNames()    得到過濾器配置中的所有初始化參數(shù)名字的枚舉類型.

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

 說完了請求,我們再來說說響應(yīng).

我們經(jīng)常需要在向瀏覽器輸出內(nèi)容時,過濾一些敏感詞匯.

新建一個內(nèi)容替換的封裝器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){        //必須調(diào)用父類構(gòu)造方法        super(response);    }    public PrintWriter getWriter() throws IOException{        //返回字符數(shù)組Writer,緩存內(nèi)容        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 {            // 導(dǎo)入資源文件            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;        // 實例化響應(yīng)器包裝類        ResponseReplaeWrapper resp = new ResponseReplaeWrapper(res);        chain.doFilter(request, resp);        // 緩存輸出字符        String outString = resp.getCharWriter().toString();        // 循環(huán)替換不合法的字符        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 {    }}

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 平度市| 静安区| 东辽县| 桐柏县| 麻阳| 连江县| 德钦县| 武宣县| 黄浦区| 松原市| 徐水县| 桐柏县| 淮安市| 鞍山市| 常熟市| 洛南县| 石林| 同德县| 河源市| 南丰县| 嘉荫县| 舟曲县| 桓台县| 绥德县| 亳州市| 怀化市| 宾阳县| 河南省| 那坡县| 色达县| 阿克苏市| 武穴市| 新昌县| 南丹县| 颍上县| 玉田县| 蒙城县| 肥乡县| 漳平市| 罗平县| 徐州市|