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

java—过虑器基础2(48)

2019-11-14 23:56:20
字体:
来源:转载
供稿:网友
java—过虑器基础2(48)过虑器链FilterChain

当一个web项目中有多个连接器,且这些过虑器对同个url进行过虑。这时就形成了过虑器链/。

在filter的配置当中,有两个配置:filter,filter-mapping.

Filter-mapping在前,则先执行,在后则后执行。

<filter>

<filter-name>first</filter-name>

<filter-class>cn.itcast.filter.FirstFilter</filter-class>

</filter>

<filter>

<filter-name>second</filter-name>

<filter-class>cn.itcast.filter.SecondFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>second</filter-name>

<url-pattern>/four</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>first</filter-name>

<url-pattern>/four</url-pattern>

</filter-mapping>

过虑器应用之1-设置request编码

写一个过虑器,对所有url全部过虑,/*.在doFilter方法中,设置request的编码为utf-8。

一般情况下,这个过虑器永远是第一个要执行的过虑器。

最好是通过配置设置编码。<filter><init-param>&hellip;

第一步:实现Filter接口,在doFIlter中接收初始化参数,设置编码

package cn.hongxin.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;

public class CharFilter implements Filter {

//声明编码的成员变量

PRivate String encoding;

public void init(FilterConfig config) throws ServletException {

encoding = config.getInitParameter("bm");

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding(encoding);

//放行,必须要放行。

chain.doFilter(request, response);

}

public void destroy() {

}

}

第二步:将上面的类配置到web.xml

<filter>

<filter-name>char</filter-name>

<filter-class>cn.itcast.filter.CharFilter</filter-class>

<init-param>

<!-- 为了便于配置,在配置文件中设置编码 -->

<param-name>bm</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>char</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


对get可以处理中文

在CharFilter中对reuqest进行包装。

目的:修改增强getParameter方法,如果是get转码。

第一步:声明包装类:

//声明包装类

class MyRequest extends HttpServletRequestWrapper{

public MyRequest(HttpServletRequest request) {

super(request);

}

//增强getParamter

@Override

public String getParameter(String name) {

String val = super.getParameter(name);

if(super.getMethod().equals("GET")){

try {

val = new String(val.getBytes("ISO-8859-1"),super.getCharacterEncoding());

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

return val;

}

}

第二步:在doFilter方法中,声明包装类的实例

package cn.hongxin.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 CharFilter implements Filter {

// 声明编码的成员变量

private String encoding;

public void init(FilterConfig config) throws ServletException {

encoding = config.getInitParameter("bm");

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding(encoding);

response.setContentType("text/html;charset=" + encoding);

// 判断是否需要包装

HttpServletRequest req = (HttpServletRequest) request;

if (req.getMethod().equals("GET")) {

request = new MyRequest(req);

}

// 声明包装类的实例

// 放行

chain.doFilter(request, response);

}

public void destroy() {

}

}

// 声明包装类

class MyRequest extends HttpServletRequestWrapper {

public MyRequest(HttpServletRequest request) {

super(request);

}

// 增强getParamter

@Override

public String getParameter(String name) {

String val = super.getParameter(name);

try {

val = new String(val.getBytes("ISO-8859-1"),

super.getCharacterEncoding());

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return val;

}

}



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