概述
记录在跟随老师学习过程中学习心得。
先上过滤器代码
package com.fldwws.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//强转
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//判断访问资源是否和登录相关
String[] urls = {"/login.jsp","/imgs/","/css/","/LoginServlet","/CheckCodeServlet","/RegisterServlet","/register.jsp"};
//获取当前访问路径
String requestURL = req.getRequestURL().toString();
//循环判断
for (String url : urls){
if (requestURL.contains(url)){
//放行
chain.doFilter(request, response);
return;
}
}
//判断session中是否有user
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//判断user是否为null
if(user != null){
//有数据 已经登录过了
//放行
chain.doFilter(request, response);
}else{
//未登录
//存储提示信息并跳转到登录界面
req.setAttribute("login_msg","您尚未登录!");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
}
1. 如何判断用户是否登录?
根据session中是否存在user来进行判定。取
user
这个对象,看是否存在。如果存在即说明已经登录。
代码:
//判断session中是否有user
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
2. 判断用户是否登录之后逻辑是什么?
如果已经登录,则放行。
若未登录,则提示用户未登录,并跳转到登录界面
代码:
//判断user是否为null
if(user != null){
//有数据 已经登录过了
//放行
chain.doFilter(request, response);
}else{
//未登录
//存储提示信息并跳转到登录界面
req.setAttribute("login_msg","您尚未登录!");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
3.对于与登陆相关资源的处理
这里首先要判断用户当前所在路径,这个也提供了方法。
代码:
//获取当前访问路径
String requestURL = req.getRequestURL().toString();
其次,我们需要定义,哪些资源是不需要被拦截的。这里需要注意一下路径的写法,注意看,基本所有的路径都是前面加上一个
/
也就是根目录,但是相对于目录
而言,她下面的所有资源都需要被放行,因此在前后都需要加上/
。
//判断访问资源是否和登录相关
String[] urls = {"/login.jsp","/imgs/","/css/","/LoginServlet","/CheckCodeServlet","/RegisterServlet","/register.jsp"};
再然后就是进行循环判断,由于处于初学阶段,记录下我掌握得不够得地方。
- 循环的使用。for循环括号的内部一共分为两部分,其中右侧写数组,左侧写的是数组中每一个值,左侧又可以分为两部分,前部分是该数组的类型,后面的可以自行定义,在之后的操作中,使用后面自行定义的内容即可。
- contains的使用。这里用的是用户访问的路径去匹配我们写的路径,其实也合理,因为用户的url是非常长的一串,当然是使用大的去判断是否包含小的,
- 放行之后的逻辑。
可以看到,放行之后直接return掉,就是直接结束了这个拦截的方法,这里确实稍稍有点绕不过弯。那就顺着思考,如果用户正在访问登录界面,即,处于for循环中,我们放行处理,然后就是跑后面的逻辑。后面的逻辑是什么呢?判断用户是不是已经登录,那现在的用户必然没有进行登录,filter又会跳转到登录界面,又将执行for循环的条件,又进行放行,这样会无线循环下去,发生多次请求错误。
//循环判断
for (String url : urls){
if (requestURL.contains(url)){
//放行
chain.doFilter(request, response);
return;
}
}
最后
以上就是淡然小松鼠为你收集整理的Filter案例--登录验证的全部内容,希望文章能够帮你解决Filter案例--登录验证所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复