関連する場合、サーブレット応答(モデルチェンジ、認証コード、のServletContextファイルのダウンロード)

リダイレクト

  1. まず最初のセットに応じてステータスコードを設定します

     //访问Demo1自动跳转至Demo2
        //设置状态码
        response.setStatus(302);
        //设置响应头
        response.setHeader("location","/response/responseDemo2");    
  2. 完全なリダイレクションのsendRedirect(文字列の位置)メソッド

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

    リダイレクト機能:redirect

    1. アドレスバーの変更

    2. リダイレクションは他のサイト(サーバー)のリソースにアクセスすることができます

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

    3. リダイレクトが2つの要求であります

    転送機能:forward

    1. そのままパスの転送
    2. 現在のサーバーでのみアクセスできリソースを転送
    3. 転送要求で、要求オブジェクトは、データを共有するために使用することができます

    パスの文言:

    カテゴリパス

    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());

検証コード

  • エッセンス:写真
  • 目的:悪質な操作を防ぐために

サーブレットコード:

 //创建对象,在内存中生成图片(验证码对象)
        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>
    
</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>

サーブレット

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ウェブはIMGファイルファイルの下に置かれています

  • 問題:

    • 中国のファイル名の問題(中国語となって「___」フォーム)
  • ソリューション:

    • クライアント情報が使用するブラウザのバージョンを取得します。

    • 符号化モードのファイル名を設定し、バージョン情報に応じて、

      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);

サーブレット完全なコード:

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);
    }
}

おすすめ

転載: www.cnblogs.com/PoetryAndYou/p/11318455.html