有个关于跟路径的问题

有个关于跟路径的问题

我的工程的根路径设置了/ ,

为什么访问工程下的html文件

http://img1.sycdn.imooc.com//climg/605d6f9b099af9e808420538.jpg

我的工程名是homework ,我改成homework.login.html 就可以访问了,  /只对servlet生效吗?


同时我在servlet进行响应的时候,

res.sendRedirect("/login.htm");

跳转的还是404,正常情况下,我知道需要工程名+映射名,但是我都设置了跟路径不就不用加了吗?

老师之前讲的多终端配置器的时候,设置的就是/阿。

http://img1.sycdn.imooc.com//climg/605d70510997f26908560352.jpg

就没有加工程名阿。


以上问题存在后,我又重启了tomcat,又可以访问了。。这是什么情况啊。晕死

当工程设置跟路径为/的时候, 那么进行响应重定向的时候,就不需要输入工程名+映射了吧。直接输入映射就可以吧。 


问题2:

为什么我在页面登录后,不会chain 失效了,不会忘后传递阿。又跳回到了本次页面, 感觉死循环了。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>2-5作业</title>
</head>
<body>
<div style="margin-left:40px;">
<h1>系统登录</h1>
</div>
<form action="/servlet/login" id="form">
<ul style="list-style-type: none">
<li >用户名:</li>
<li><input id="name" style="width:200px;"></li>
<li>密码:</li>
<li><input type="password" id="password" style="width:200px;"></li>
<li style="margin-top:10px;"><input type="submit" value="登录" id="btn"></li>
</ul>
</form>
<script type="text/javascript">
//创建登录事件:
document.getElementById("form").onsubmit=function(){
//正则表达式设置登录信息
var regexN=/^[a-z|A-Z|0-q]{1,10}$/;
var regexP=/^[a-z|A-Z|0-q]{1,10}$/;
//获取登录和密码的value值
var name=document.getElementById("name").value;
var password=document.getElementById("password").value;
//进行匹配
if(regexN.test(name)==false){
alert("用户名不符合当前格式!");
return false;
}else if(regexP.test(password)==false){
alert("密码不符合当前格式!");
return false;
}else{
alert("登录成功");
return true;
}
}

</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>默认主页</h2>
</body>
</html>
package com.imooc.homework;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//2-5作业,过滤器
public class LoginFilter implements Filter {

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//强制转换
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
//获取表单的值
String form=req.getParameter("form");
//获取当前uri
String uri=req.getRequestURI();
System.out.println(uri);
//进行判断
if(uri.startsWith("/login")) {
chain.doFilter(request, response);

}else if(form.equals("true")){
res.sendRedirect("/servlet/login");
}else {
res.sendRedirect("/login.html");
}



}

@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}
package com.imooc.homework;


//作业2-5
import java.io.IOException;

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 javax.servlet.http.HttpSession;

/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/servlet/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session=request.getSession();
//获取前端id信息
String name=request.getParameter("name");
String password=request.getParameter("password");
//将前端登录的账号保存到session内
session.setAttribute("loginUser",name );
//响应重定向到显示主页
response.sendRedirect("/homepage.html");


}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

我判断的当url的开头为login,就放行的阿,然后进到了登录页面,当进行提交成功后,就会转到到下一个页面,必然会触发到过滤器,然后我在过滤器,获取到了表单的value阿,表单不是为true,就会提交吗,我在if里面判断了下,如果为true就进行转到主页面,可以出现了空指针异常阿。 如果不判断的话,当登录页面成功后跳转到了下一个页面,过滤器生效,又是个死循环。。。

我通过获取session对象,通过id来判断,当id!=null的时候,肯定登录成功了。 然后跳转到主页,通过表单的不可以判断吗。。。

过滤器如果设置过滤的话,对所有范围进行拦截, 那么就存在每一次访问新的地址,每一次跳转都会拦截吧。。就好比第一次登录后,拦截,然后放行回到登录页面,登录成功后跳转主页,拦截,然后判断后,再放行。。。根据你的项目跳转的几次来过滤器适当的添加判断、、对吧。。

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

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

2回答
好帮手慕小班 2021-03-27 15:18:49

同学你好,1、当用户在浏览器中第一次向服务器发送请求时,就会创建当前的会话session,无论是否拦截这个请求,都会创建。

    2、从session中获取到的User对象是,在对应登录的Servlet中,验证通过,将用户存入session中,比如

http://img1.sycdn.imooc.com//climg/605ed9a2096366ed08350399.jpg

    3、这里同学可以这样理解这个请求流程,当一个请求发送到服务器中,判断它是不是登录请求,如果是登录请求,则直接放行,进入登录判断,如果不是登录请求,则进行session中的用户判断,不为空则放行。

http://img1.sycdn.imooc.com//climg/605edc36096decfc10770478.jpg

这就是一个登录过滤器的简单流程。

祝学习愉快!

好帮手慕小班 2021-03-26 15:37:50

同学你好,1、同学的说法是正确的,当工程设置根路径为/的时候, 在进行响应重定向的时候,就不需要输入工程名,直接输入映射地址就可以。

    2、在同学的过滤器中,有几个问题:

        1)、onsubmit 事件会在表单中的确认按钮被点击时发生,在onsubmit 事件中经常用到return关键字,当

返回true时,onsubmit 事件就为onsubmit =“return true”这时则会进行下一步。

反之,当返回一个false,当前请求将不会继续运行。

        2)、在表单中会根据input标签中name的属性作为key值来提交。

        3)、同学获取key为form的值,在表单中并没有提交key为form的值,所以获取不到key为form的值。也就出现了空指针。

并且不建议同学添加这个form表单的boolean值的判断,因为onsubmit事件的返回值并不会提交到后台中

http://img1.sycdn.imooc.com//climg/605d8a0609a2740d04630300.jpg

        3)、在当前过滤器中,只有当请求为login时,才会放行请求,并没有session中是否存在对象的判断,也没有对应的放行内容,所以同学的判断有误,同学先完成过滤器的判断,当session中user存在时,直接放行。

另外,建议同学不要修改问题,有问题可以用追问的形式提出,否则不便于老师定位同学的问题,也会造成回答不准确。

祝学习愉快!

  • 提问者 rock221 #1
    当session为user时,这个判断是在过滤器设置吧? 因为当uri为login放行,就到了login页面了,输入过信息登录成功后就又进行拦截了,这时候的映射地址就不是login了,如果不判断的话,则就又会回到login页面了。@因为过滤器设置的有如果登录的uri不是login开头的话,则表示没登录成功,会跳转到login页面,这样是个死循环了。 还有个问题,当请求发送的时候,过滤器进行拦截,这时候session都被创建了吧? 只要发送请求 服务器就会创建一块session区域吧?
    2021-03-27 00:55:39
  • 好帮手慕小班 回复 提问者 rock221 #2

    同学你好,1、是的,user是否为空是在过滤器中判断的。

        ​2、同学可以使用判断当前路径是否需要过滤,再判断是否登录了,比如

    http://img1.sycdn.imooc.com//climg/605e90ba09bd68cb08200654.jpg

        ​3、在浏览器中,一个用户第一次想服务器发送请求时,就会创建一个session。

    祝学习愉快!

    2021-03-27 10:02:31
  • 提问者 rock221 回复 好帮手慕小班 #3
    即使请求被过滤器拦截了,session也被创建好了? js中可以把属性存到session中吗
    2021-03-27 10:17:07
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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