重定向

  1. 首先设置状态码,设置响应头

    	//访问Demo1自动跳转至Demo2
    //设置状态码
    response.setStatus(302);
    //设置响应头
    response.setHeader("location","/response/responseDemo2");
  2. 通过sendRedirect(String location)方法完成重定向

     		//访问Demo1自动跳转至Demo2
    response.sendRedirect("/response/responseDemo2");

    重定向特点 :redirect

    1. 地址栏发生变化

    2. 重定向可以访问其他站点(服务器)的资源

      response.sendRedirect("https://www.baidu.com");

    3. 重定向是两次请求

    转发的特点:forward

    1. 转发路径不变
    2. 转发只能访问当前服务器下的资源
    3. 转发是一次请求,可以使用request对象来共享数据

    路径写法:

    路径分类

    1. 相对路径

      1. 找到当前资源和目标资源之间的位置关系
    2. 绝对路径:通过绝对路径可以确定唯一资源
      1. 规则:判断定义的路径是给谁用的

        1. 客户端浏览器:需要加虚拟目录(项目的访问路径)
        2. 给服务器用:不需要加虚拟目录

服务器输出字符数据到浏览器

  1. 步骤

    1. 获取字符输出流

    2. 输出数据

    3. 注意乱码

      		//设置流的默认编码: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");

服务器输出字节数据到浏览器

  1. 步骤

    1. 获取字节输出流
    2. 输出数据
            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

  1. 文件下载需求:

    1. 页面显示超链接
    2. 点击超链接后弹出下载提示框
    3. 完成图片文件下载

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的编码方式

      1. 代码如下:

      使用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;
      }
      }
      1. 在设置响应头前加如下代码:

        //解决中文文件名问题
        //获取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文件下载)的更多相关文章

  1. Servlet中Response对象应用2(输出随机验证码图片)

    预期结果如图: 可用于登陆界面的验证 需要使用random类和绘画相关的几个类.以及imageio的内容. import java.awt.*; import java.awt.image.Buffe ...

  2. Servlet中response、request乱码问题解决

    Java Web(二) Servlet中response.request乱码问题解决   三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...

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

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

  4. Java Web(二) Servlet中response、request乱码问题解决

    三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, M ...

  5. Servlet中response对象Commit状态的分析

    response是服务端对客户端请求的一个响应,其中封装了响应头.状态码.内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等. 服务端在把response提交到客户端之前,会使用一个缓 ...

  6. web开发(二) Servlet中response、request乱码问题解决

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...

  7. Servlet中Response对象应用1(输出简单文字、实现文件下载)

    通过response对象可以实现很多功能,下面的代码都是在myeclipse上实现过的,整理下路,以备后用. response对象应用1 1向客户端发送简单消息 A利用已经声明的对象,调用其getOu ...

  8. Servlet中response.sendRedirect()跳转时不能设置target的解决办法

    一般使用Struts2的拦截器(或者是filter)验证是否登录的时候,如果用户没有登录则会跳转到登录的页面.这时候一般可以在拦截器或者filter中用response.sendRedirect(). ...

  9. servlet中的request和response

    request对象 1.什么是请求 a.浏览器向服务器发送数据就是请求. 一.request功能1--获取数据 1.获取浏览器相关的信息 getRequestURL方法 -- 返回客户端发出请求完整U ...

随机推荐

  1. Hyper-V 下linux虚拟机静态IP上网配置的两种方式(1)

    工作需要,搭建linux环境,网上搜了两种Hyper-V配置linux静态IP及上网的方式,记录一下,方便查阅,如下是桥接方式的配置: 本实例所用的各项资源说明,系统是windows10企业版64bi ...

  2. Luogu1119灾后重建

    题目背景 BBB 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公 ...

  3. jenkins中使用变量

    查看jenkins内置变量: 1.新建一个job: 2.构建-增加构建步骤-执行shell: 3.点击  可用的环境变量列表 即可查看 如WORKSPACE : 作为工作空间分配给构建目录的绝对路径 ...

  4. spark上 spark-shell和java -jar访问hdfs路径问题

    部署spark集群 使用spark包 spark-1.0.2-bin-hadoop2.tgz 在spark-shell和java -jar访问hadoop hdfs上的文件写法是有区别的 在spark ...

  5. 用最简单的方式学Python单链表

    Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...

  6. ThreadLocal小试牛刀

    ThreadLocal中保存的数据只能被当前线程私有,不被其它线程可见 证明 声明一个全局的变量threadLocal,初始值为1,通过3个线程对其进行访问修改设置,理论上threadLocal的最终 ...

  7. Java基础(十四)代理(Proxy)

    1.为什么要使用代理 代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 假设有一个表示接口的Class对象(有可能只包含一个接口),它的确 ...

  8. (二)AS给button添加点击事件

    三种方法给Button添加点击事件 (一)通过button的id,添加继承View.OnClickListener的监听实现 <Button android:id="@+id/btn_ ...

  9. python *args,**kwargs参数

    实际上,关键的是*和** 我们以三个例子来解释: 普通的使用参数: def test1(arg): print(arg) test1("a") 输出: a *是将剩下的参数用元祖表 ...

  10. Android_Fragment栈操作 commit()问题分析

    栈操作时遇到一个问题 getFragmentManager().beginTransaction() .replace(R.id.fl_container,bFragment) .addToBackS ...