HTTP中URL的get请求,中文参数乱码

1.不同浏览器对HTTP的URL参数编译不一致;

我遇到的情况是低版本的IE对中文参数进行编码导致乱码;


解决:使用js中的encodeURI函数来对URL地址进行编码(UTF-8)

然后后台解码即可。




JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript">
    function a_click(obj){
    	obj.href=encodeURI(obj.href);
    	return true;
    }
</script>
<title>Test Page</title>
</head>
<body>
	<h1>根目录:</h1>
	<c:forEach items="${listRoot }" var="file"  varStatus="status">
		<span>硬盘:<a href="/DownLocalFile/sf?url=${file }" οnclick="a_click(this)">${file }</a></span>
	</c:forEach>	 

	<h2>url:${returnUrl }</h2>
	<c:forEach items="${listDirectory }" var="file">
		<span>文件夹:<a href="/DownLocalFile/sf?url=${returnUrl }/${file }" οnclick="a_click(this)">${file }</a></span>
		<br/>
	</c:forEach>

	<c:forEach items="${listFile }" var="file">
		<span>文件:<a href="/DownLocalFile/dlf?url=${returnUrl }/${file }" οnclick="a_click(this)">${file }</a></span><br/>
	</c:forEach>
	
	<br/>
	
</body>
</html>


JAVA:

1.Search File Class

package com.maxtt.servlet;

import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SearchFile extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {		
		String url = req.getParameter("url");
		
		if(null!=url)
			url = URLDecoder.decode(url,"utf-8");
		
		
		//获取根目录
		List<String> listRoot = new ArrayList<String>();
		for(File f : getFile(null) ){
			listRoot.add(f.getPath().replace("\\", ""));
		}
		req.setAttribute("listRoot", listRoot);
		
		//获取url目录
		File[] files = getFile(url);
		
		List<String> listFile = new ArrayList<String>();
		List<String> listDirectory = new ArrayList<String>();
		for(File f : files ){
			if(f.isFile()){
				listFile.add(f.getName());
			}else{
				listDirectory.add(f.getName());
			}
		}
		req.setAttribute("returnUrl", url);
		req.setAttribute("listFile", listFile);
		req.setAttribute("listDirectory", listDirectory);
		//跳转
		req.getRequestDispatcher("/Test.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	private File[] getFile(String url){
		if(null == url || url.isEmpty()){
			return File.listRoots();
		}
		File file = new File(url);
		return file.exists() ? file.listFiles() : File.listRoots();
	}
	
	
	
}



在文件下载的时候也出现了中文乱,使用UTF-8解码再用ISO8859-1编码。

2.DownLoad File Class

package com.maxtt.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownLoadFile extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String url = req.getParameter("url");
		if(null==url){
			return;
		}

		File file = new File(url);
		if(file.exists()&&file.isFile()){
			//获取响应的输出流
			OutputStream os = resp.getOutputStream();
			byte[] buff = new byte[1000];
			//解决中文乱码
			resp.setHeader("Content-disposition", "attachment;filename="+new String(file.getName().getBytes("UTF-8"),"ISO8859-1"));
			String fileLength = String.valueOf(file.length()); 
			resp.setHeader("Content-Length", fileLength);//下载文件时显示的长度
			FileInputStream inputStream = new FileInputStream(file); //读取文件流
	        while(inputStream.read(buff)!=-1){  
	            os.write(buff);//写出
	        }  
	        inputStream.close(); 
	        os.close();
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值