编码过滤器不起作用

weiyongzhi2005 2009-06-19 04:35:51
各位,在struts框架里面,我写了个过滤器类,然后在web.xml文件中进行了配置,但是测试时,由页面跳到action处理时,action中拿到的参数值还是乱码,不能起作用

filter类
package com.isoftstone.struts.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;
import javax.servlet.http.HttpServletResponse;

public class EncodingFilter implements Filter {

String encoding = null ;
public void destroy() {
// TODO Auto-generated method stub

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
request.setCharacterEncoding(encoding);
}

public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
encoding = arg0.getInitParameter("encoding");
}

}


web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.isoftstone.struts.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>/GovPro/*</url-pattern>
</filter-mapping>


<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
...全文
510 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
divchen 2011-06-02
  • 打赏
  • 举报
回复
能说下你怎么解决的么?采用的什么方法
weiyongzhi2005 2009-06-20
  • 打赏
  • 举报
回复
谢谢各位的指点,问题已经解决了
sahala3293 2009-06-19
  • 打赏
  • 举报
回复
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
request.setCharacterEncoding(encoding);
}

你这样能执行到action中的话,应该是没有执行到这个filter,
因为你少写了一行arg2.doFilter(request,response);如楼上.
还有你的这个过滤器,只能过滤post请求情况下的 ,以下这种post和get都没问题


package cn.com.yd.gamecard.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;
import javax.servlet.http.HttpServletResponse;

/**
* 字符编码过滤器
* @author
*
*/
public class EncodeFilter implements Filter {

private String encode = "gb2312";

public void destroy() {


}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {

HttpServletRequest hreq = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
response.setContentType("text/html;charset="+encode);
HttpRequestWapper req = new HttpRequestWapper(hreq);
arg2.doFilter(req, arg1);
}

public void init(FilterConfig arg0) throws ServletException {
String encodeName = arg0.getInitParameter("encode");
if(encodeName != null && !"".equals(encodeName.trim())){
this.encode = encodeName;
}
}

public class HttpRequestWapper extends HttpServletRequestWrapper{

public HttpRequestWapper(HttpServletRequest request) {
super(request);

}
//重写方法
public String getParameter(String name){
String str = null;
str = encoding(((HttpServletRequest)this.getRequest()).getParameter(name));

return str;
}
public String[] getParameterValues(String name){
String[] str = null;
str = ((HttpServletRequest)this.getRequest()).getParameterValues(name);
if(str != null){
for(int i = 0; i < str.length; i++){
str[i] = encoding(str[i]);
}
}
return str;
}

}
//实现转码
public String encoding(String str){
if(str != null){
try {
str = new String(str.getBytes("iso-8859-1"),this.encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return str;
}


}





<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>cn.com.yd.gamecard.filter.EncodeFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
bingsha1976 2009-06-19
  • 打赏
  • 举报
回复
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
request.setCharacterEncoding(encoding);



request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
chain.doFilter(request,response);
yukang_ky 2009-06-19
  • 打赏
  • 举报
回复
如果你要对所有的请求都要编码的话,就要更改web.xml文件,如下

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

yukang_ky 2009-06-19
  • 打赏
  • 举报
回复
问一下你,你发出请求时,有到运行EncodingFilter的代码吗,如果没有,那么将该页面放到入GovPro文件夹下,应该你在web.xml配置时只指定了对GovPro下的文件过滤。
sangshusen_1988 2009-06-19
  • 打赏
  • 举报
回复
楼主是通过超连直接进来的还是通过form的post请求过来?
如果是超连过来的,可以试下这样看看
tomcat目录下conf/server.xml中
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI="true"/>
内容概要:本文围绕基于Basisformer模型的时间序列锂离子电池SOC(State of Charge,荷电状态)预测展开研究,利用PyTorch框架实现深度学习模型的构建与训练。通过将历史充放电数据作为输入,Basisformer能够有效捕捉电池状态的动态变化特征,提升SOC预测精度。文中详细介绍了模型结构设计、数据预处理流程、训练策略及实验结果分析,并与传统方法进行对比,验证了该方法在复杂工况下的优越性与鲁棒性。该研究不仅展示了Basisformer在时序建模中的潜力,也为电池管理系统提供了高精度的状态估计解决方案。; 适合人群:具备一定Python编程基础和深度学习理论知识,熟悉PyTorch框架,从事电池管理系统、新能源汽车或智能预测方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于电动汽车、储能系统等领域的电池SOC高精度实时估算;②为电池健康管理(BMS)提供可靠的状态输入;③推动深度学习在时间序列预测中的实际落地,提升现有预测模型的泛化能力与稳定性; 阅读建议:建议读者结合标题为【锂电池SOC估计】【PyTorch】基于Basisformer时间序列锂离子电池SOC预测研究(python代码实现)的资源,重点研读所提供的Python代码,深入理解数据处理方式与模型网络结构的设计思路,尝试调整超参数以观察对预测性能的影响,从而全面掌握Basisformer在时序建模中的优势、适用边界及工程化实现路径。

67,536

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧