Jayson_Dai 2022-08-30 13:14 采纳率: 66.7%
浏览 89
已结题

关于HTTP的重定向,Location的问题

现象

我在某培训班学java,最近想稍微深究一下 “手写spring boot” 的内容。
在实现 “重定向” 部分的时候,教给我们的方式是,状态行设置好状态代码302,状态原因balabala
然后只需要在响应头里面添加 “Location", 值设置成一个html文件路径就好了。貌似剩下的HTML会自动搞定。(是否其他地方有额外操作被我忽视了?)

问题出现在Location的路径这里,我们在学着写代码的时候,并没有给定上级路径,直接给定了相对路径: "/文件路径"。
貌似工作的时,java会在编译后的target/classes/static目录下自动找到这个指定的文件。
我自己重写的时候,因为算是盲写,没有怎么看老实(天啦怎么会有这种屏蔽词)教的版本,所以我用PrintWriter生成一个临时html文件的时候,思路是生成在target/classes/dynamic目录下,然后再把这个路径添加到响应头的Locatin里面去。
然后我发现工作不了,貌似是404.

老Shi的代码部分:
```java
    public void sendRedirect(String path){
        //重定向的状态代码为302
        statusCode = 302;
        statusReason = "MovedTemporarily";
        //响应头Location
        addHeader("Location",path);
    }
if(username==null||username.isEmpty()||password==null||password.isEmpty()){
            response.sendRedirect("/login_info_error.html");    // 这里只给了斜杠和文件名,文件在static目录下
            return;
        }

###### 我的部分代码

```java
// 这里的 dirDynamic目录就是 和 static目录同级的 dynamic 目录 
File tmpDynamicHtml = new File(dirDynamic, "/tmp.html");
try (PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tmpDynamicHtml), StandardCharsets.UTF_8)), true)) {
            pw.println("<!DOCTYPE html>");
            pw.println("<html lang='en'>");
            pw.println("<head>");
            pw.println("<meta charset='UTF-8'>");
            pw.println("<title>用户列表</title>");
            pw.println("</head>");
            pw.println("<body>");
            pw.println("
"); pw.println("

用户列表

"
); pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); for (User u : users) { pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); } pw.println("
用户名昵称年龄操作
" + u.getUsername() + "" + u.getNickname() + "" + u.getAge() + "" + "删除" + "
"
); pw.println("
"
); pw.println("</body>"); response.sendDirectory("/tmp.html"); // 这里我也试过"../dynamic/tmp.html",访问的时候都是404。我用File类这样生成文件夹就没问题 } catch (FileNotFoundException e) { e.printStackTrace(); }
我的问题

我想问下,用java写服务器,重定向时候的"Location"响应头,是否只能访问static目录下的文件吗?还是我忽视了哪个可能出现的简单的问题?

  • 写回答

3条回答 默认 最新

  • 编号灬9527 2022-08-30 13:46
    关注

    首先访问的是url,其次是跳转的地址没有限制,哪里都行(比如百度,没有地址限制,前提是接口能被访问)

    评论

报告相同问题?

问题事件

  • 系统已结题 9月7日
  • 创建了问题 8月30日