JAVA小白学习BUG------通过web实现模拟客户端登入

前言:这个作业比较难理解,因为第一次通过客户端与服务端的相互连接完成的操作,所以有的思路没有及时跟上,还有一些细节没有处理好,经过老师多次讲解思路逐渐清晰;

首先,因为还没有学数据库,所以再登入时只能将账号和密码写死,然后通过IDEA写两个前端页面(因为我学的是后端,所以这边代码抄的是老师写的),分别是输入账号,输入密码的登入页面,和登入以后跳转的页面;

 

现在就要将登入页面的帐号与密码与服务端形成连接了,先获取客户端的账号密码使用req.get方法 

String name = req.getParameter("username");
String password = req.getParameter("password");

因为没有学习数据库所以直接使用if语句来进行一个判断,当账号密码等于我要求的时候进行下一步操作,如果密码错误,则直接向客户端反馈;

//进行一个判断,密码正确则进行下一步操作
if("zs".equals(name)&&"123456".equals(password)){
//使用一个Session来存储登入状态
    HttpSession session = req.getSession();
    session.setAttribute("login",true);

    resp.sendRedirect(req.getContextPath()+"/index.html");
}else {
   //获取文本类型,否则会出现乱码情况
    resp.setContentType("text/plain;charset=utf8");
    resp.getWriter().write("登入失败请重新登入");
}

这边需要使用一个session对象来存储用户登入状态,并且进行一个键值对赋值操作,便于在使用过滤器时作为条件进行放行操作,这边先不看等等要进入的过滤器逻辑,假设都成功后就可以进行跳转页面的操作了,运用到的知识点时重定向,这边其实还有一个简便做法就是直接输入要跳转页面的名称这样就可以直接跳转,更加的简便;

二:现在进行一个过滤操作,要判断是否返回登入的条件,首先进行一个强制转换,因为过滤器里的那两个是req,resp的父类,所以可以运用一个多态的原理来进行一波强制转换,这样才能拿到我先前存储在session里的状态

//这边要进行一个强制转换,才能拿到先前存储在session中的登入状态
 HttpServletRequest  httpServletRequest=(HttpServletRequest)servletRequest;
 HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;

接着就要进行一个判断了,判断是否返回的是我先前存储的true,首先也是默认先创造一个布尔类型的指针,给他赋值一个false

//这里要看是否为空指针状态,如果不是则进入下一流程
Boolean login=false;

然后进行一个判断,判断session.get里的值这时候是否为空值,如果为空值的话,那就直接跳转到登入页面,如果值不为空指针的话那就说明可以将我们先前所创建的布尔值变量获取session.get中存储的值

if (session.getAttribute("login")!=null){
    //将其强制转换成布尔类型,用于判断登入状态
    login=(Boolean)session.getAttribute("login");
}
if (login){
    filterChain.doFilter(servletRequest,servletResponse);
}else {
    httpServletResponse.sendRedirect("login.html");
}

接下来获取了登入页面session的状态以后,就可以进行判断了,当为true时就进行一个放行操作,就可以跳转页面了;

三:这边需要注意的一点是,当使用这个过滤器时它默认是选择过滤所有接口的,那就代表着过滤器会连登入接口也进行拦截,那就会一直进行重定向操作,那么就连登入页面都无法访问;

这边可以使用一个通行白名单来解决问题,首先我们req.getServelPath方法来获取拦截的路径

//这边因为拦截器会最先开始拦截所有接口所以需要创建一个不被拦截器拦截的接口名单
 String path = httpServletRequest.getServletPath();
 System.out.println(path);

然后使用一个字符串数组存储被拦截的路径

String[] whitePath={"/login.html","/login"};

这时候我们可以选择封装一个方法来将我们要放行的路径进行一个循环判断

//封装一个方法可以更加简便用于过滤一些可以直接放行的路径
public Boolean isWhitePath(String[] whitePath,String path){
    for (String paths:whitePath){
        if (path.equals(paths)){
            return true;
        }
    }
    return false;
}

然后在在使用一个if()语句判断当为true时可以直接放行;

这边需要注意的是必须将剩下的全部代码都放到else里,要不然就会一直进行重定向操作

if (isWhitePath(whitePath,path)){
           filterChain.doFilter(servletRequest,servletResponse);
       }
else{
           //这里要看是否为空指针状态,如果不是则进入下一流程
           Boolean login=false;
           if (session.getAttribute("login")!=null){
               //将其强制转换成布尔类型,用于判断登入状态
               login=(Boolean)session.getAttribute("login");
           }
           if (login){
               filterChain.doFilter(servletRequest,servletResponse);
           }else {
               httpServletResponse.sendRedirect("login.html");
           }
       }

这就是大体实现思路以及操作方法;末尾附完整代码;

登入页面代码:

 @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先获取前端的账号密码信息;
        String name = req.getParameter("username");
        String password = req.getParameter("password");
        //进行一个判断,密码正确则进行下一步操作
        if("zs".equals(name)&&"123456".equals(password)){
        //使用一个Session来存储登入状态
            HttpSession session = req.getSession();
            session.setAttribute("login",true);

            resp.sendRedirect(req.getContextPath()+"/index.html");
        }else {
           //获取文本类型,否则会出现乱码情况
            resp.setContentType("text/plain;charset=utf8");
            resp.getWriter().write("登入失败请重新登入");
        }
    }
}

过滤器代码

//默认拦截所有接口,以达成过滤效果
@WebFilter("/*")
public class FilterPath implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       //这边要进行一个强制转换,才能拿到先前存储在session中的登入状态
        HttpServletRequest  httpServletRequest=(HttpServletRequest)servletRequest;
        HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
       //这边因为拦截器会最先开始拦截所有接口所以需要创建一个不被拦截器拦截的接口名单
        String path = httpServletRequest.getServletPath();
        System.out.println(path);
        //创建并获取session对象,并通过get方法获取先前存储的登入状态
        HttpSession session = httpServletRequest.getSession();
        String[] whitePath={"/login.html","/login"};
       if (isWhitePath(whitePath,path)){
           filterChain.doFilter(servletRequest,servletResponse);
       }
else{
           //这里要看是否为空指针状态,如果不是则进入下一流程
           Boolean login=false;
           if (session.getAttribute("login")!=null){
               //将其强制转换成布尔类型,用于判断登入状态
               login=(Boolean)session.getAttribute("login");
           }
           if (login){
               filterChain.doFilter(servletRequest,servletResponse);
           }else {
               httpServletResponse.sendRedirect("login.html");
           }
       }


    }
    //封装一个方法可以更加简便用于过滤一些可以直接放行的路径
    public Boolean isWhitePath(String[] whitePath,String path){
        for (String paths:whitePath){
            if (path.equals(paths)){
                return true;
            }
        }
        return false;
    }
  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值