为什么我写成resp.sendRedirect("/WEB-INF/jsp/categoryList.jsp"); 这个跳转显示不出来

为什么我写成resp.sendRedirect("/WEB-INF/jsp/categoryList.jsp"); 这个跳转显示不出来

package com.per.maglley.controller;

import com.per.maglley.entity.User;
import com.per.maglley.utils.XmlDataSource;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/login")
public class LoginController extends HttpServlet {
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html;charset=UTF-8");
       req.setCharacterEncoding("UTF-8");
       String username = req.getParameter("username");
       String password = req.getParameter("password");
       System.out.println("username:"+username);
       System.out.println("password:"+password);
       List<User> userData = XmlDataSource.getUserData();
       boolean flag = false;
       for(User user :userData){
           if(user.getUserPassword().equals(password) && user.getUserName().equals(username)) {
               flag = true;
               break;
           }
       }
       System.out.println(flag);
       if(flag){
           resp.sendRedirect("/WEB-INF/jsp/categoryList.jsp");
       }else {
           resp.sendRedirect(req.getContextPath() + "/login.html");
       }
   }
}
package com.per.maglley.service;

import com.per.maglley.entity.User;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class LoginFilter implements Filter {
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       HttpServletRequest request = (HttpServletRequest) servletRequest;
       HttpServletResponse response = (HttpServletResponse) servletResponse;
       HttpSession session = request.getSession();
       User user = (User) session.getAttribute("login");
       boolean flag = false;
       String uri = request.getRequestURI();
       String[] url = {".js", ".ico", ".css", ".jsp", ".html", ".png", "/login"};
       for (String str : url) {
           if (uri.indexOf(str) != -1) {
               flag = true;
               break;
           }
       }
       if (!flag) {
           if (user != null) {
               filterChain.doFilter(servletRequest, servletResponse);
               return;
           } else {
               response.sendRedirect("/login.html");
               return;
           }
       }
       filterChain.doFilter(servletRequest, servletResponse);
   }
}
package com.per.maglley.utils;

import com.per.maglley.entity.User;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

public class XmlDataSource {
   private static List<User> userData = new ArrayList();
   private static String dataFile;
   static {
       dataFile = XmlDataSource.class.getResource("/user.xml").getPath();
        readUserXml();
   }
   private static void readUserXml(){
       try {
           dataFile= URLDecoder.decode(dataFile,"UTF-8");
           System.out.println(dataFile);
           SAXReader reader = new SAXReader();
           //获取Document文档对象
           Document document = reader.read(dataFile);
           List<Node> nodes = document.selectNodes("/user/userid");
           userData.clear();
           for(Node node : nodes){
               Element element =(Element) node;
               String id = element.attributeValue("id");
               String username = element.elementText("username");
               String password = element.elementText("password");
               User user = new User();
               user.setUserName(username);
               user.setUserPassword(password);
               userData.add(user);
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   public static List<User> getUserData() {
       return userData;
   }
}

http://img1.sycdn.imooc.com//climg/603d0af00956bfe718860323.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小班 2021-03-04 10:16:13

同学你好,1、getRequestDispatcher请求转发并不会改变浏览器的地址栏,只有重定向sendRedirect才能改变浏览器的地址栏。

    ​2、因为同学当前的jsp页面在WEB-INF安全目录中,所以只能使用请求转发getRequestDispatcher。

如果同学想要实现改变浏览器地址栏,同学可以将自己的jsp页面移出WEB-INF目录,直接放在WebContent目录下,然后就可以使用重定向sendRedirect。

祝学习愉快!

好帮手慕小班 2021-03-02 10:20:38

同学你好,

1、sendRedirect是重定向请求。重定向是浏览器会发送两次请求,先去服务器端拼好请求地址以后,再由浏览器重新发起的请求。

 2、而WEB-INF作为安全目录,并不能直接访问。

所以如果页面在WEB-INF目录下,是不可以直接通过浏览器地址访问;因为WEB-INF目录是安全目录,不能直接访问该目录下的文件,只能通过转发访问,也就是需要先跳转到对应的controller中,然后通过转发跳转到WEB-INF下的页面中。

综上所述,同学的resp.sendRedirect("/WEB-INF/jsp/categoryList.jsp");书写有误,并不能正确访问到,同学尝试将地址为WEB-INF目录下的请求,将重定向换成转发再来试试。

​祝学习愉快!

  • 提问者 听风诉说 #1

    那怎么访问WEB-INF下的文件时文件地址会发生改变

    2021-03-02 20:20:45
  • 好帮手慕小班 回复 提问者 听风诉说 #2

    同学你好,同学可以使用转发请求,比如:

    req.getRequestDispatcher("/WEB-INF/jsp/categoryList.jsp").forward(request, response);

    如上所示,再来试试。

    祝学习愉快!

    2021-03-03 09:42:31
  • 提问者 听风诉说 回复 好帮手慕小班 #3

    我的意思是跳转到这个jsp下面时,uri地址可以发生改变。

    req.getRequestDispatcher("/WEB-INF/jsp/categoryList.jsp").forward(request, response);

    这个不会改变uri地址

    2021-03-03 23:06:35
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师