论坛首页 Java企业应用论坛

EL表达式中param的缺陷? 对于直接输入URL重写无法进行转码问题

浏览 17799 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (2)
作者 正文
   发表时间:2008-05-28  
写在前面的话

在javaeye发了2个帖 都被扣了分 一个还直接被拉到隐藏 所以这个问题我按照论坛的规定一步步来

自己思考 做测试 查资料 但是都没有结果 才敢发这个帖子 斑竹 请您看清楚

主要是关于 一个EL表达式的

${ param.XXX }

于是我写了以下一个测试页面


x.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  <html>  
  <body>  
    ${ param.a} 
  </body>  
  </html> 


然后我在地址栏 直接输入Http://127.0.0.1:8080/demo/x.jsp?a=大家好

显示为乱码 于是我开始了一系列转码和查资料过程

1 加入代码块 request.setCharsetEncoding("UTF-8"); 不能成功 乱码

2  利用jstl  <%@  taglib  prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt"  %> 
在body下输入 <fmt:requestEncoding  value="UTF-8"  />  不能成功 乱码

随后查了些资料
找到下面这句
使用get方法提交表单,浏览器会对URL中的参数使用UTF-8编码,但是由于get方法提交内容没有在HTTP请求中指定参数的编码方式,所以服务器端会使用默认的编码方式来对URL的参数进行解码

那么我就写了一个过滤器
依然没有成功


这里我要声明 我能保证正我的过滤器是正确的 因为我做了测试 如果是用 页面->Servlet 那么无论get 还是 post都是可以正确显示

然而加上过滤器后
在地址栏 直接输入Http://127.0.0.1:8080/demo/x.jsp?a=大家好 还是显示的是乱码

到此 我也没有其他可行的办法
是不是这是EL里面 param的一个缺陷呢? 对于直接输入的URL重写(我说的是直接输入) 无法进行转码 ?
   发表时间:2008-05-28  
补:

刚才准备发贴的时候 又把所有办法都试验了一次 还是不行
0 请登录后投票
   发表时间:2008-05-28  
为了大家更加看清楚 我将我的过滤器贴上来

package classmate;

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 {
	FilterConfig filterConfig;
	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		MyRequest req = new MyRequest( (HttpServletRequest)arg0);//设置代理请求
		  arg2.doFilter(req, arg1);
	}

	public void init(FilterConfig arg0) throws ServletException {
		this.filterConfig = arg0;

	}
	
	

}





package classmate;

import java.io.UnsupportedEncodingException;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class MyRequest extends HttpServletRequestWrapper {

	HttpServletRequest request;
	public MyRequest(HttpServletRequest request) {
		super(request);
		// TODO Auto-generated constructor stub
		this.request = request;
	}
	public String getParameter(String name) {
		String str = super.getParameter(name);
		str = this.myEncoding(str);
		return str;
	}
	public String[] getParameterValues(String name)
	{
		String strs[] = super.getParameterValues(name);
		for(int i=0;i<strs.length;i++)
		{
		   strs[i]  = this.myEncoding(strs[i]);
		}
		 return strs;
	}
	
    private String myEncoding(String input)
    {
    	String output ="";
		try 
		{
		   output = new String(input.getBytes("ISO-8859-1"),"UTF-8"); 
		} 
		catch (UnsupportedEncodingException e) {
		   // TODO Auto-generated catch block
		   e.printStackTrace();
		}
		  return output;
	}
}




在 HttpServletRequestWrapper  我重写了2个 方法. 在我的Servlet里面就可以直接
request调用 只要是页面提交到Servlet进过该过滤器 都可行
0 请登录后投票
   发表时间:2008-05-28  
tomcat是可以设置编码过滤的,不过值针对get请求,在配置文件中加入这个参数就可以了  URIEncoding="UTF-8"
0 请登录后投票
   发表时间:2008-05-28  
补充一句:针对8080端口和8009端口的都加上那个参数,至于什么原因去网上查
0 请登录后投票
   发表时间:2008-05-28  
josen 能给出具体修改方法吗? 比如在哪个文件下面?
0 请登录后投票
   发表时间:2008-05-28  
conf下面的server.xml

具体还不知道对你的问题是否有效,去试试吧
0 请登录后投票
   发表时间:2008-05-28  
conf下面的server.xml 
汗了 我也知道在 server.xml
麻烦你写出来好吗 我网上找了没有相关的
0 请登录后投票
   发表时间:2008-05-28  
<Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true"
               URIEncoding="UTF-8"/>
0 请登录后投票
   发表时间:2008-05-28  
你的文件本身的编码方式的问题。

另外,url直接传参数应该转码,这是起码的常识。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics