how2j.cn

下载区
文件名 文件大小
j2ee.rar 890k
步骤 1 : 在Servlet中进行登陆验证的局限性   
步骤 2 : 使用Filter处理   
步骤 3 : 配置web.xml   
步骤 4 : 练习-在login.jsp页面的js,css和图片文件   
步骤 5 : 答案-在login.jsp页面的js,css和图片文件   

步骤 1 :

在Servlet中进行登陆验证的局限性

edit
用户是否登陆的验证中,我们可以通过在HeroListServlet中增加对session的判断代码来做到登陆验证。

但是按照这样的做法,所有的Servlet都要加上一样的代码,就会显得比较累赘。

与通过Filter处理中文问题一样,也可以通过Filter一次性解决所有的登陆验证问题
步骤 2 :

使用Filter处理

edit
创建一个AuthFilter 类
String uri = request.getRequestURI();
if (uri.endsWith("login.html") || uri.endsWith("login")) {
chain.doFilter(request, response);
return;
}

首先判断是否是访问的login.html和loginHero,因为这两个页面就是在还没有登陆之前就需要访问的

String userName = (String) request.getSession().getAttribute("userName");
if (null == userName) {
response.sendRedirect("login.html");
return;
}


从Session中获取userName,如果没有,就表示不曾登陆过,跳转到登陆页面。
package filter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; 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; public class AuthFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String uri = request.getRequestURI(); if (uri.endsWith("login.html") || uri.endsWith("login")) { chain.doFilter(request, response); return; } String userName = (String) request.getSession().getAttribute("userName"); if (null == userName) { response.sendRedirect("login.html"); return; } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }
配置AuthFilter
<filter> <filter-name>AuthFilter</filter-name> <filter-class>filter.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
	<filter>
		<filter-name>AuthFilter</filter-name>
		<filter-class>filter.AuthFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>AuthFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
		
步骤 4 :

练习-在login.jsp页面的js,css和图片文件

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
因为这个过滤器的存在,在登陆之前所有的资源都不能访问。 所以在login.jsp上如果有图片,js和css,也不能够正常显示和工作。

这样做当然是不行的,那么如何让js css和图片文件即使在不登陆的情况下,也可以访问呢?
步骤 5 :

答案-在login.jsp页面的js,css和图片文件

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费2个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费2个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
package filter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; 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; public class AuthFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String uri = request.getRequestURI(); //如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录 if (uri.endsWith(".css") || uri.endsWith(".js")) { chain.doFilter(request, response); return; } if (uri.endsWith("login.html") || uri.endsWith("login")) { chain.doFilter(request, response); return; } String userName = (String) request.getSession().getAttribute("userName"); if (null == userName) { response.sendRedirect("login.html"); return; } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2021-04-07 我的登录页面是index.jsp结果被拦截了,看了一会才发现。。还以为tomcat出错了
VOID1

我的登录页面是index.jsp结果被拦截了,看了一会才发现。。还以为tomcat出错了,这个坑大家避开下







回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2021-02-28 个人理解
chumyuenlaw

首先第一次访问的页面是login.html,当输入了用户名和密码,并点击登录按钮后,就进行了一次请求,进入到过滤器中。 此时,过滤器AuthFilter中的if (uri.endsWith("login.html") || uri.endsWith("login"))生效,执行了代码块chain.doFilter(request, response);,意味着过滤器放行了,可以继续执行。 接着在LoginServlet.java中获取login.html中的用户名和密码,并进行比较,比较正确后,执行以下代码 request.getSession().setAttribute("userName", name); response.sendRedirect("listHero"); 意思是:第一句在session中保存用户名;第二句是重定向到listHero。 此时重定向到listHero有发生了第二次请求,第二次进入到过滤器中,执行判断。 if (uri.endsWith("login.html") || uri.endsWith("login"))不满足,跳过。 然后if (null == userName)判断用户名是否为空,如果是空,则重定向到login.html;如果非空,过滤器放行,继续执行listHero后续的代码(显示Hero列表)。 当用户再次访问时,session中已经存有用户名了,if (null == userName)就不会执行,过滤器会放行。




2 个答案

叶子的回忆
答案时间:2022-03-29
说的很对

asdhiodhw
答案时间:2021-03-19
思路清晰



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-09-09 总之一句话,拦截器就是对请求的盘问
2020-04-24 站长,过滤器可以跳过.css和.js,但是图片是不是还是无法显示呢?
2020-04-01 想问一下LoginServlet TMD在哪儿?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 16 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-Filter-登陆验证 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图