步骤 2 : 使用Filter处理 步骤 3 : 配置web.xml 步骤 4 : 练习-在login.jsp页面的js,css和图片文件 步骤 5 : 答案-在login.jsp页面的js,css和图片文件
在用户是否登陆的验证中,我们可以通过在HeroListServlet中增加对session的判断代码来做到登陆验证。
但是按照这样的做法,所有的Servlet都要加上一样的代码,就会显得比较累赘。 与通过Filter处理中文问题一样,也可以通过Filter一次性解决所有的登陆验证问题
创建一个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>
因为这个过滤器的存在,在登陆之前所有的资源都不能访问。 所以在login.jsp上如果有图片,js和css,也不能够正常显示和工作。
这样做当然是不行的,那么如何让js css和图片文件即使在不登陆的情况下,也可以访问呢?
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
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公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2024-08-05
基于 Filter、MVC 、DAO 、Servlet 和Tomcat,实现 CRUD 和 用户登录、验证、注册等功能的 J2EE 代码
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-04-07
我的登录页面是index.jsp结果被拦截了,看了一会才发现。。还以为tomcat出错了
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-02-28
个人理解
2020-09-09
总之一句话,拦截器就是对请求的盘问
2020-04-24
站长,过滤器可以跳过.css和.js,但是图片是不是还是无法显示呢?
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 17 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|