现象
我在某培训班学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("" + u.getUsername() + " ");
pw.println("" + u.getNickname() + " ");
pw.println("" + u.getAge() + " ");
pw.println("" + "删除" + " ");
pw.println(" ");
}
pw.println("
");
pw.println("");
pw.println("</body>");
response.sendDirectory("/tmp.html"); // 这里我也试过"../dynamic/tmp.html",访问的时候都是404。我用File类这样生成文件夹就没问题
} catch (FileNotFoundException e) {
e.printStackTrace();
}
我的问题
我想问下,用java写服务器,重定向时候的"Location"响应头,是否只能访问static目录下的文件吗?还是我忽视了哪个可能出现的简单的问题?