有个关于跟路径的问题
我的工程的根路径设置了/ ,
为什么访问工程下的html文件
我的工程名是homework ,我改成homework.login.html 就可以访问了, /只对servlet生效吗?
同时我在servlet进行响应的时候,
res.sendRedirect("/login.htm");
跳转的还是404,正常情况下,我知道需要工程名+映射名,但是我都设置了跟路径不就不用加了吗?
老师之前讲的多终端配置器的时候,设置的就是/阿。
就没有加工程名阿。
以上问题存在后,我又重启了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
同学你好,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事件的返回值并不会提交到后台中
3)、在当前过滤器中,只有当请求为login时,才会放行请求,并没有session中是否存在对象的判断,也没有对应的放行内容,所以同学的判断有误,同学先完成过滤器的判断,当session中user存在时,直接放行。
另外,建议同学不要修改问题,有问题可以用追问的形式提出,否则不便于老师定位同学的问题,也会造成回答不准确。
祝学习愉快!
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星