1,Servlet请求响应中文乱码问题

 package com.demo.servlet;
import java.io.PrintWriter;
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo5Servlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* 关于重定向,Servlet封装了sendRedirect方法 则sendRedirect方法的底层其实是两步
* 第一步是设置响应状态码为302
* 第二步是设置响应头的location属性值为需要跳转到的url
*/
resp.setStatus(302);
resp.setHeader("location", "/ServletDemo/demo2");
// 以上两步的效果与以下方法相同
resp.sendRedirect("/ServletDemo/demo2");
// 设置页面自动过5秒种跳转到另一个地址
resp.setHeader("refresh", "5;url=/ServletDemo/demo2");
/*
* Servlet响应中文乱码的问题,主要分两步
* 第一步是当response把中文写入到Tomcat引擎之前,是先把内容写入到response缓冲区的,
* 此时需要告诉response需要以什么样的编码形式写入到缓冲区,即设置setCharacterEncoding();
* 第二步是告诉浏览器以什么样的编码方式读取response响应的信息,即设置setHeader
* 其实第一步不设置,只设置第二步便可起到同样的效果
*/
//告诉response缓冲区将以什么样的编码方式写入
resp.setCharacterEncoding("utf-8");
//行文浏览器以什么样的编码方式解决response响应的内容
resp.setHeader("Content-type", "text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("hello");
writer.write("<br/>");
writer.write("你好"); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp);
} }

Servlet响应中文乱码

2,Servlet手动实现下载

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function click() {
var href = '/ServletDemo/down?filename=张三.jpg';
href = encodeURI(href);
console.info(href);
location.href = href;
}
</script>
</head>
<body>
<a href="/ServletDemo/down?filename=a.jpg">jpg</a>
<br />
<a href="/ServletDemo/down?filename=a.mp3">mp3</a>
<br />
<a href="/ServletDemo/down?filename=a.flv">flv</a>
<br />
<a href="/ServletDemo/down?filename=a.mp4">mp4</a>
<br />
<a href="/ServletDemo/down?filename=a.txt">txt</a>
<br />
<a href="/ServletDemo/down?filename=a.zip">zip</a>
<br />
<a href="javascript:click()">张三</a> </body>
</html>

Servlet手动下载前端

 package com.demo.servlet;

 import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; public class DownServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = req.getParameter("filename");// 获取所需要下载的文件名
String oldFileName = filename;// 之所以声明一个oldFileName是为了服务器需要根据这个文件名字找到相对应的文件
System.out.println(filename);
String agent = req.getHeader("User-Agent");// 获取客户端浏览器版本
//根据浏览器版本对所要下载的文件名称进行编码,以便在下载的时候正确显示文件名称
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
String path = this.getServletContext().getRealPath("download/" + oldFileName);// 获取所下载的资源的绝对路径
// 设置要下载的文件类型,通过文件名获取文件的MIME类型
resp.setContentType(this.getServletContext().getMimeType(filename));
// 告诉浏览器别直接打开文件,而是以下载的形式保存文件
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
InputStream input = new FileInputStream(path);// 将文件封装输入流
ServletOutputStream output = resp.getOutputStream();// 获取response的输入流对象
int len = 0;// 读取到的字节长度
byte[] buffer = new byte[1024];// 读取到的缓冲区
while ((len = input.read(buffer)) > 0) {
output.write(buffer, 0, len);// 读取缓冲区的字节到输出流
}
input.close();
output.close(); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp);
} }

Servlet手动下载后端

Java中关于Servlet中请求中文乱码及文件下载的更多相关文章

  1. 尚硅谷面试第一季-09SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢

    目录结构: 关键代码: web.xml <filter> <filter-name>CharacterEncodingFilter</filter-name> &l ...

  2. Spring MVC中如何解决POST请求中文乱码问题,GET的又如何处理呢

    在web.xml中配置过滤器 GET请求乱码解决: 在Tomcat中service.xml中

  3. 关于java代码提交HTTP POST请求中文乱码的解决方法

    首先说明下这些只是根据我工作常用经验的总结,可能不一定完全对,也不一定全面,但却是最通用的. JAVA里HTTP提交方式 httpurlconnection:jdk里自带的 httpclient:ap ...

  4. Java -- 通过 URLConnection 进行http请求中文乱码

    对writer和reader指定字符集 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8 ...

  5. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  6. 解决ubuntu中zip解压的中文乱码问题

    转自解决ubuntu中zip解压的中文乱码问题 在我的ubuntu12.10中,发现显示中文基本都是正常的,只有在解压windows传过来的zip文件时,才会出现乱码.所以,我用另一个方法解决中文乱码 ...

  7. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

  8. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

    一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...

  9. JSP/ Servlet常见的中文乱码原因

    在开发中,我们经常遇到中文乱码的问题,比方: &浏览器中看到的 Jsp/Servlet 页面中的汉字成了 '?' ?  &浏览器中看到的 Servlet 页面中的汉字都成了乱码  &a ...

随机推荐

  1. Chrome控制台毫无反应,打印不出信息了?

    最近在使用console.log()方法的时候遇到一个奇怪的问题,打开chrome控制台想调试代码,结果控制台半天无反应,让我纳闷了半天.详情如图所示: 然后我又打开了新的标签页,不行!接着干脆关闭浏 ...

  2. 主要看思路:区域数据去重 + JavaScript一次性展示几万条数据实例代码

    近期做1功能,Gis地图 基于百度地图api , 会遇到的问题的, 如后台接口给的数据很多,大几千上万的,如果拿了数据直接渲染dom ,这滋味爽爽的. 再遇上 客户端浏览器悲催的,这卡顿就来了... ...

  3. 移动端App开发 - 01 - 开篇

    移动端App开发 - 01 - 开篇 从此笔记之后开启移动端 app 开发学习 该系列笔记去掉所有无关重要的东西,简介干练 我的移动端App开发笔记 1.移动端App开发 - 02 - iPhone/ ...

  4. Vue小案例(一)

    案例需求: 创建一个品牌展示表格,表头有编号(id),品牌名称(name),创建时间(time)和操作,需要实现的功能是对数据的增删操作,和时间的格式化. 思路分析:在开发之前需要想清楚要用到Vue中 ...

  5. selenium元素定位方法

    一.如何找到页面元素 Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找.下面介绍几种比较常用的方法. 1.1By ID 假设页面写成这样:i ...

  6. d3js selections深入理解

    D3 selections选择DOM元素以便可以对这些dom元素做相应的操作,比如:更改其style,修改其属性,执行data-join操作,或者插入.删除相应elements 比如,如果给定5个ci ...

  7. Linux基础和常用命令

    经常使用的命令: #查看端口被占用情况 netstat -tunlp|grep #查看java进程 ps -ef|grep java #压缩前端工程 rar a -ep1 ./update/win32 ...

  8. C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解

    笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func& ...

  9. 对1001. A+B Format (20)的描述

    Github仓库的链接 https://github.com/deepYY/object-oriented/blob/master/A-B-Format/A.B.Format.c 解题思路: 输入a, ...

  10. Linux下中间人攻击利用框架bettercap测试

    0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名的莫过于ettercap,而开发bettercap的目的不是为了追赶它,而是替代它 ...