session和filter实现登录案例

前提准备在之前的两篇文章中

一.登录功能的实现

1.新建一html个文件,实现登录

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<!--创建一个表单,实现登录效果-->
<!--用  MyHttpServlet来处理登录,其路径/servlet
-->
<form action="/Web2_war/servlet" method="get">
    用户名: <input type="text" name="username">
    <br>
    密码:   <input type="password" name="password">

    <input type="submit" value="login">
</form>

</body>
</html>

2.在MyHttpServlet.java文件中处理登录逻辑

package com.hhh.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //登录逻辑
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //假如用户为hhh,密码为123
        if("hhh".equals(username)&&"123".equals(password)){
            //登录成功,跳转页面(重定向)
            resp.sendRedirect("/Web2_war/index.html");

        }else {
            //登录失败
            resp.getWriter().print("login failed");
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    }
}

3.新建一个需要跳转到的页面index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>成功页面</title>
</head>
<body>
<h1>成功登录!</h1>
</body>
</html>

4.启动tomcat(启动之前先把之前的过滤器注释了)

1.输入错误的用户名或密码

 

 2.效果

3.输入正确的用户名和密码

 

 4.效果

 二.登录成功后,实现登录访问页面,未登录访问失效

1.创建其他html文件table.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>table页面</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
  <tr >
        <td>姓名</td>
        <td>性别</td>
        <td>年龄</td>
  </tr>

    <tr>
        <td>哈哈哈</td>
        <td>女</td>
        <td>22</td>
    </tr>

    <tr>
        <td><嘿嘿嘿</td>
        <td>男</td>
        <td>24</td>
    </tr>
</table>
</body>
</html>

2.创建session和filter

假如需要访问table.html或index.html页面,如果没登录,提示登录失败。这边登录成功后,在MyHttpServlet中需要创建一个session,再在外边创建一个类,用来创建过滤器,在过滤器里头写有没有session的逻辑,有session就代表登录成功。

1.现在MyHttpServlet中创建一个session

 2.创建一个filter,对原有的MyFilter进行书写逻辑

package com.hhh.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       // System.out.println("filter ini");

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //登录权限控制
        //之前,需要强转为HttpServletRequest类型的servletRequest,这样才能从里头拿session
        HttpServletRequest req= (HttpServletRequest) servletRequest;
        //如果获取不到,表示没登录,返回null,这里参数为false
        HttpSession session = req.getSession(false);
        if(session==null){
            //未登录
            servletResponse.getWriter().print("not login");
            return;
            //如果未登录,执行return,程序就结束,执行不了原有逻辑

        }
        Object currentUser = session.getAttribute("currentUser");
        System.out.println("currentUser:"+currentUser);
        //只有登录成功才会执行到这,才会执行原有逻辑
        filterChain.doFilter(servletRequest, servletResponse);//执行原来的逻辑,注释掉就代表拦截原有逻辑不执行

        //之后
    }

    @Override
    public void destroy() {

    }
}

3.在web.xml中将原有的filter配置还原

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.hhh.filter.MyFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <!--拦截所有路径-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3.运行程序

1.先运行index.html,这时未登录,访问失败。请求发起会先经过过滤器,过滤器通过之后才会到达具体资源

 2.运行login.html,发现也登录失败,是因为处理逻辑部分(因为没有登录所以这里不能登录,陷入死循环)

 3.修改MyFilter中的逻辑代码,把登录的请求过滤

StringBuffer requestURL = req.getRequestURL();
            //这里的参数Web2_war/servlet有误,暂时不清楚填什么,逻辑往下顺没问题
        if(requestURL.toString().contains("Web2_war/servlet")){
            //这次请求是登录
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

 4.程序执行后续具体

1.执行login.html,登录成功,可以访问其他table、index等页面

2.登录失败,不能访问able、index等页面

3.这里我的参数有误,无论访问哪个页面都被拦截下来,等后面了解相关知识点再进行整改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值