Servlet中response的相关案例(重定型,验证码,ServletContext文件下载)
重定向
首先设置状态码,设置响应头
//访问Demo1自动跳转至Demo2
//设置状态码
response.setStatus(302);
//设置响应头
response.setHeader("location","/response/responseDemo2");
通过sendRedirect(String location)方法完成重定向
//访问Demo1自动跳转至Demo2
response.sendRedirect("/response/responseDemo2");
重定向特点 :
redirect地址栏发生变化
重定向可以访问其他站点(服务器)的资源
response.sendRedirect("https://www.baidu.com");重定向是两次请求
转发的特点:
forward- 转发路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
路径写法:
路径分类
- 相对路径
- 找到当前资源和目标资源之间的位置关系
- 绝对路径:通过绝对路径可以确定唯一资源
- 规则:判断定义的路径是给谁用的
- 客户端浏览器:需要加虚拟目录(项目的访问路径)
- 给服务器用:不需要加虚拟目录
- 规则:判断定义的路径是给谁用的
服务器输出字符数据到浏览器
步骤
获取字符输出流
输出数据
注意乱码
//设置流的默认编码:ISO-8859-1 设置为GBK,防止乱码
response.setCharacterEncoding("GBK");
//告诉浏览器,服务器发送的消息体数据的编码
//response.setHeader("content-type","text/html;charset=utf-8");
//简单形式。设置编码
response.setContentType("text/html;charset=utf-8");
//获取字符输出流
PrintWriter writer = response.getWriter();
//输出数据
writer.write("hello");
服务器输出字节数据到浏览器
步骤
- 获取字节输出流
- 输出数据
response.setContentType("text/html;charset=utf-8");
//获取字节输出流
ServletOutputStream outputStream = response.getOutputStream();
//输出数据
outputStream.write("hellow".getBytes());
验证码
- 本质:图片
- 目的:防止恶意操作
servlet代码:
//创建对象,在内存中生成图片(验证码对象)
int width=100;
int height=50;
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//美化
//填充背景色
Graphics graphics=bufferedImage.getGraphics();
//背景颜色
graphics.setColor(Color.PINK);
graphics.fillRect(0,0,width,height);
//字体颜色
graphics.setColor(Color.BLUE);
graphics.drawRect(0,0,width-1,height-1);
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Random random=new Random();
int x=0;
for (int j = 0; j < 4; j++) {
int i = random.nextInt(str.length());
char A=str.charAt(i);
graphics.drawString(A+"",x+=20,25);
}
//画线
for (int i = 0; i < 4; i++) {
int x1 = random.nextInt(100);
int x2 = random.nextInt(100);
int y1 = random.nextInt(50);
int y2 = random.nextInt(50);
graphics.drawLine( x1, y1, x2, y2);
}
//输出演示
ImageIO.write(bufferedImage,"jpg",response.getOutputStream());
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<script>
window.onload=function () {
var a=document.getElementById("check");
a.onclick=function () {
//时间戳
var date=new Date().getTime();
a.src="/response/checkCodeServlet?"+date;
}
var b=document.getElementById("change");
b.onclick=function () {
var elementsByName = document.getElementsByTagName("img")
var date=new Date().getTime();
elementsByName[0].setAttribute(src,"/response/checkCodeServlet?"+date)
}
}
</script>
</head>
<body>
<img id="check" src="/response/checkCodeServlet"/>
<a id="change" href="">看不清换一张</a>
</body>
</html>
文件下载 ServletContext
- 文件下载需求:
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件下载
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/rui/downloadServlet?filename=1.jpg">图片</a>
</body>
</html>
servlet
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author rui
* @create 2019-08-07 22:07
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数文件名
String filename = request.getParameter("filename");
//找到文件真是路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//设置response的响应头类型context-type
//获取文件类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("context-type",mimeType);
//设置响应头打开方式content-disposition
response.setHeader("content-disposition","attachment;filename="+filename);
response.setContentType("content-disposition:attachment;filename=xxx");
//用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//将输入流写出到输出流
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
提示1.jpg是放在web下的img文件中的文件
问题:
- 中文文件名问题(中文变成”___“形式)
解决:
获取客户端使用的浏览器版本信息
根据不同的版本信息,设置filename的编码方式
- 代码如下:
使用
DownLoadUtils工具类import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; public class DownLoadUtils { public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
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");
}
return filename;
}
}在设置响应头前加如下代码:
//解决中文文件名问题
//获取user-agent请求头
String header = request.getHeader("user-agent");
filename = DownLoadUtils.getFileName(header, filename);
servlet完整代码:
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author rui
* @create 2019-08-07 22:07
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数文件名
String filename = request.getParameter("filename");
//找到文件真是路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//设置response的响应头类型context-type
//获取文件类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("context-type", mimeType);
//设置响应头打开方式content-disposition
//解决中文文件名问题
//获取user-agent请求头
String header = request.getHeader("user-agent");
filename = DownLoadUtils.getFileName(header, filename);
response.setHeader("content-disposition", "attachment;filename=" + filename);
response.setContentType("content-disposition:attachment;filename=xxx");
//用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//将输入流写出到输出流
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Servlet中response的相关案例(重定型,验证码,ServletContext文件下载)的更多相关文章
- Servlet中Response对象应用2(输出随机验证码图片)
预期结果如图: 可用于登陆界面的验证 需要使用random类和绘画相关的几个类.以及imageio的内容. import java.awt.*; import java.awt.image.Buffe ...
- Servlet中response、request乱码问题解决
Java Web(二) Servlet中response.request乱码问题解决 三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...
- Java Web之Servlet中response、request乱码问题解决
Java Web之Servlet中response.request乱码问题解决 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...
- Java Web(二) Servlet中response、request乱码问题解决
三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, M ...
- Servlet中response对象Commit状态的分析
response是服务端对客户端请求的一个响应,其中封装了响应头.状态码.内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等. 服务端在把response提交到客户端之前,会使用一个缓 ...
- web开发(二) Servlet中response、request乱码问题解决
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...
- Servlet中Response对象应用1(输出简单文字、实现文件下载)
通过response对象可以实现很多功能,下面的代码都是在myeclipse上实现过的,整理下路,以备后用. response对象应用1 1向客户端发送简单消息 A利用已经声明的对象,调用其getOu ...
- Servlet中response.sendRedirect()跳转时不能设置target的解决办法
一般使用Struts2的拦截器(或者是filter)验证是否登录的时候,如果用户没有登录则会跳转到登录的页面.这时候一般可以在拦截器或者filter中用response.sendRedirect(). ...
- servlet中的request和response
request对象 1.什么是请求 a.浏览器向服务器发送数据就是请求. 一.request功能1--获取数据 1.获取浏览器相关的信息 getRequestURL方法 -- 返回客户端发出请求完整U ...
随机推荐
- MySQL学习(二)索引原理及其背后的数据结构
首先区分几个概念: 聚集索引 主索引和辅助索引(即二级索引) innodb中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(sec ...
- SVN部署(基于Linux)
第一步:通过yum命令安装svnserve,命令如下: yum -y install subversion 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 若需查看svn安装 ...
- windows服务隐藏后门之克隆帐号
windows服务隐藏后门之克隆帐号 1.CMD命令行下,建立了一个用户名为“test$”,密码为“abc123!”的简单隐藏账户,并且把该隐藏账户提升为了管理员权限. PS:CMD命令行使用&quo ...
- 详解AJAX工作原理以及实例讲解(通俗易懂)
什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味 ...
- React+Antd+Antd-Img-Crop实现上传固定大小的裁剪头像或者图片(且可控制图片数量)
见章知著 1024,程序员们节日快乐!本文主要讲述react配合antd以及react-img-crop第三方库实现一个可控的图片上传功能. 运行项目 需要具有node环境 第三方库安装 1.antd ...
- opencv::卷积运算函数filter2D()
opencv::卷积运算函数filter2D() 使用掩模板矩阵(kernel)计算每个像素值 与原图相比,没有黑边 int main(int argc, char** argv) { Mat src ...
- Go语言系列开发之延迟调用和作用域
Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java.Python,数据分析.人工智能和大数据等相关系列文章.希望能和大家一起 ...
- SQL common keywords examples and tricks
Case Sensitive Check 1. Return names contain upper case Select id, name from A where name<>low ...
- The usage of Markdown---链接的使用
目录 1. 序言 2. 网页链接 3. 图片链接 4. 页内跳转 更新时间:2019.09.14 1. 序言 在编辑文章的时候,我们常常需要插入各种链接,比如说网页链接,图片链接等等.当文章篇幅过 ...
- Windows包管理器
Windows包管理器 Scoop 参考 安装命令 set-executionpolicy remotesigned -scope currentuser #用powershell执行 iex (ne ...