会话技术和过滤器的实现

1.Cookie和Session

http是一种无状态的访问

浏览器发送请求到服务器,服务器给与一定的响应,但是断开连接以后,如果服务器更新了,如果服务器没有发送任请求,是没有任何响应的

这个就是无状态的访问:

实际操作中存在一定的问题:

比如登录一个网站以后,再次跳转到这个网站的其他页面,他是不会保持第一个页面的状态的,这叫无状态的。

登录一个页面的话,他不会保证上一页面的状态,如何来保持上一个页面的状态的呢?靠咱们即将要讲的会话技术(Cookie和Session),才能保持上一个页面的状态!!!

如果没有cookie和session的话,http协议是一个无状态的协议,你每一个跳转到下一个页面的时候都是需要先登录的,这就很麻烦了。

比如淘宝(cookie和session的话),登录上去了,(需要登录才能)选择商品,(需要登录)放到购物车,(需要登录)然后购买,这样用户的体验是相当差的然后才有会话控制。会话控制的目的就是为了点击页面的时候,保持上面一个页面的状态

1.1会话技术

cookie:

浏览器保存的内容,通常cookie是在浏览器中保存的,每一次访问服务器的时候,浏览器会自动的把cookie带到下一个页面。

cookie的大小时有限制,通常是4096byte.

cookie信息中不能有中文

cookie的保存是以键值对形式存在的

session:

保存服务器中,每一个session在咱们当前的服务器会有一个标识号,

会保存浏览器访问服务器的一些记录信息,没有大小的限制

可以保存中文

信息的保存也是以键值对形式存在的

1.2Cookie

如果想要使用cookie要保证咱们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器cookie关了,关了就不能再使用cookie了

常用的API

1.cookie的构造方法,目的是实例化出来cookie对象

Cookie(String name, String value);

2.设置cookie的方法

setValue(String value);修改cookie的值

setMaxAge(int time);设置cookie的有效时间

setPath(String path);设置当前cookie的有效路径

3.要将cookie发送到浏览器

response.addCookie(Cookie cookie);

先给浏览器设置cookie,获取cookie,销毁cookie,获取cookie(销毁cookie以后还有没有cookie)

设置cookie

​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建cookie对象
        //将键 是java2021  值是zhangsan实例出来,存到cookie对象中
        Cookie cookie = new Cookie("java2021", "zhangsan");
        //2.s设置有效时间,如果不设置有效时间,没有关闭浏览器,cookie一直在的
       /*
       * 正数:表示当前cookie的有效时间
       * 负数:表示当前浏览器打开的时候存在,关闭时候的没了
       * 0:销毁当前的cookie
       * */
        cookie.setMaxAge(60*60*24);//设置了有效期是个正数,即使你
        //关闭了浏览器,也可以获取cookie值,可以自动登录的东西
       
        //3.把cookie发送给浏览器
        response.addCookie(cookie);
​
    }
}
​

获取cookie


​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取浏览器中cookie,返回值是一个数组
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            //两个
            // JSESSION
            //java2021
            //浏览器一旦关闭cookie就没了
            System.out.println(cookie.getName());//获取键
            System.out.println(cookie.getValue());//获取值
            System.out.println("================");
        }
​
    }
}

销毁cookie

​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/destroyCookie")
public class DestroyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //退出登录
        Cookie[] cookies = request.getCookies();//获取cookie
        for (Cookie cookie : cookies) {
            //JSESSION
            //java2021
            if(cookie.getName().equals("java2021")) {
                cookie.setMaxAge(0);//销毁cookie
                //重新发送给浏览器
                response.addCookie(cookie);
            }
        }
    }
}
​

先设置cookie,然后得到cookie,然后销毁cookie,

1.3Session

为什么使用session?

1.cookie保存数据类型是单一的,只能保存字符串类型的数据,不能有中文

2.cookie的大小有限制

Session可以解决以上Cookie的问题

在java中 session一般结合cookie使用

1.使用session的时候一般要开启cookie

2.如果浏览器没有开启cookie功能,咱们可以通过html的url传参完成session的使用

Session的API

getSession();获取session对象的

getId();JSESSIONID(在cookie里面) 服务器下面一个标识号,session存在服务器中其中JSESSION是服务器下面的一个标识。

invalidate();销毁session

setMaxInactiveInterval();设置过期时间

setAttribute();设置session的内容

getAttribute();得到session的内容

往session里面存值,取值,销毁。让下一页面可以获取到session里面来保持下一个页面的转态

比如登录以后,用户名存到session,在咱们跳转到主页,在主页里面可以把session里面用户名字取出来展示到咱们主页面

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
//向session中存数据
@WebServlet("/setSession")
public class SessionTestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取session对象
        HttpSession session = request.getSession();
        System.out.println(session);
        //获取的是JSESSIONID  服务器唯一的标识
        System.out.println(session.getId());
        //给session设置一个过期时间,有效果的!!!
        session.setMaxInactiveInterval(60*60*24);
        session.setAttribute("name", "王");
    }
}
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取session对象
        //第一次创建session的时候默认的true,
        //fasle的话,这个session使用的已经创建好的session对象
        HttpSession session = request.getSession(false);
        //2.获取session,通过键取值
        Object name = session.getAttribute("name");
        System.out.println(name);
    }
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
//销毁session
@WebServlet("/destSession")
public class DestroyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(false);//当session存在的时候写一个false
        session.invalidate();//销毁当前的session
    }
}

1.4自动登录

结合cookie和session一起,写一个自动登录案例

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
/**
 * 判断session是否有值?如果有值就直接跳转到主页面
 * 如果没有session里面没有值,那就跳转到登录页面
 * 。在登录页面之后,在存到session里面
 */
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应乱码的解决方法
        response.setContentType("text/html;charset=utf-8");
        //写个if语句,判断session里面是否有值
        //1.获取session对象,证明已经有session对象了
        HttpSession session = request.getSession(false);
        //2.判断session里面存的值 "老王" 字符串写死了,
        //判断session和数据库里面是否一致
        System.out.println(session);
        if(session != null && session.getAttribute("user").equals("老王")) {
            //session 存的有值的情况
            String html = "<font size='7' color='green'>欢迎"+ session.getAttribute("user")+"来到直播间</font><br>";
            html += "<a href='LogoutServlet' style='color:pink;font-size=20px'>退出</a>";
            response.getWriter().append(html);
        }else {
            //session里面存的没有值的情况
            //如果没有值,就登录
            //重定向到login.html
            response.sendRedirect("login.html");
        }
​
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
​
<form action="LoginServlet" method="post">
    姓名:<input type="text" name="user"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登录">
​
</form>
​
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
​
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取前端传过来的数据html页面取过来啊
        //一位是post请求,我怕请求乱码
        request.setCharacterEncoding("utf-8");
        String user = request.getParameter("user");
        String password = request.getParameter("password");
        //验证登录信息。连上数据,写一个sql语句判断user和password
        //现在我不写了,你们来写,我写的是死数据
        //"老王"  数据库拿出来,但是我现在只写一个字符串写死了
        if("老王".equals(user) && "123".equals(password)) {
            //之间讲的登录成功以后就直接跳转到主页面了,但是现在
            //我再做一件事情,做把"老王"存到sesssion中
            //1.创建session的对象
            HttpSession session = request.getSession();
            //2.获取当前session对象的id  服务器对session唯一的标识
            String id = session.getId();
            //3.创建cookie对象,键叫JESSIONID  值 id
            Cookie cookie = new Cookie("JSESSIONID", id);
            cookie.setMaxAge(60*60);
            //4.发送给浏览器进行保存
            response.addCookie(cookie);
            //5.设置session的值
            session.setAttribute("user", "老王");
            //6.一旦session有值,重定向到IndexServlet
            //跳转到主页面了
            response.sendRedirect("IndexServlet");
​
        } else{
            response.sendRedirect("login.html");
        }
    }
}
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
​
/**
 * 销毁cookie和session
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取session对象
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();//销毁session
        }
        //销毁cookie
        Cookie cookie = new Cookie("JSESSIONID", "");
        cookie.setMaxAge(0);//才能是销毁cookie
        response.addCookie(cookie);
        //销毁以后重定向到login.html
        response.sendRedirect("login.html");
​
​
    }
}

首先写一个IndexServlet判断是否有session,如果有session就响应页面

如果没有session的话,就跳转到login.html,点击登录按钮,又跳转到了LoginServet

LoginServlet里面连接数据库判断是否登录成功,还做了一件事情,把用户名存到session里面

是因为咱们的IndexServlet里面是否有值。

2.过滤器【重点】

webServlet有三大组件:Servlet Filter(过滤器) Listerner (监听器)

2.1Filter概述

生活中中的过滤器有哪些?

净水器的滤芯 空心滤芯 鱼网

网络中拦截器:

有些网站必须是在登录下才能访问,比如咱们测评系统,一打开网址,就是登录页面

必须先登录的一些网站 过滤器有什么作用?

验证信息登录,处理字符问题,过滤跳转等

WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

就是咱们请求一个资源的时候,先通过Filter进行拦截,如果你能符合我的条件我就放行。让你继续去请求资源,如果你不符合我的条件,我就不让你去请求这个资源

2.2Filter的快速入门

1.自定义一个类去实现一个接口Fileter

2.重写方法

3.配置Filter

注解写法(只用这种情况)

配置写法

$end$没有出来什么意思?index.jsp被拦截了?为什么他被拦截了?过滤器我写的是/*,就意味着所有的

资源都要被拦截。

package com.qfedu.filter;
​
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
​
//@WebFilter("/*")   我要去拦截你所有的资源
@WebFilter("/*")
public class FilterDemo1 implements Filter {
    //写着构造方法的目的,是为了让你知道这个FilterDemo1被实例化了没
    public FilterDemo1() {
        System.out.println("我是FilterDemo1的构造方法");
    }
    public void destroy() {
        System.out.println("FilterDemo1这个过滤器被销毁");
    }
​
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //是核心方法,一般的业务逻辑写在这个地方
        System.out.println("doFilter called....");
        //  chain.doFilter(req, resp);   放行代码,
        //如果这个地方没有写 chain.doFilter(req, resp); 代码走到这个地方
        //被拦截了,不再往下走了
        //chain.doFilter(req, resp);
        chain.doFilter(req,resp);//放行,先走的是Servlet,再回到咱们过滤器
        /*
        * if语句, 该放行的就写一个  chain.doFilter(req,resp);//放
        * 不该放行的话,让他跳转到其他页面
        * */
        //这个代码是servlet执行完以后你才去执行
        System.out.println("放行以后资源访问继续");
    }
​
    public void init(FilterConfig config) throws ServletException {
        System.out.println("FilterDemo1这个过滤器被初始化");
    }
​
}
​

配置写法

Servlet也是有两种写法,一种注解写法,一种配置写法。但是只使用注解写法,注解写法太爽了

Filter也是有两种写法,一种注解写法,一种配置写法。咱们也用注解写法太爽了。

在WEB-INF里面有一个web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
​
    <filter>
        <filter-name>FiterDemo1</filter-name>
        <filter-class>com.qfedu.filter.FilterDemo1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FiterDemo1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

2.3Filter的细节处理

2.3.1Filter执行流程

浏览器访问资源路径的时候,会先匹配咱们的Filter,会被拦截下面(要么放行,要么拦截)

1.先执行的Filter

2.看是否满足条件

如果你满足我的条件,我就放行,让你去请求下面的资源

如果你不满我的条件,我就拦截,哪里来回那里去

3.放行执行资源,又回到拦截器给客户端响应

请求-》filter-》servlet-》filter-》响应

2.3.2Filter的生命周期

和Servlet的生命周期特别像

1.Filter构造方法要执行。实例化了Filter

2.Filter初始化 init

3.doFilter() 核心方法

4.服务器关闭,Filter正常销毁

2.3.3Filter过滤路径的问题【重点】

设置过滤拦截的路径

1.精准拦截

@WebFilter("/index.jsp"); 拦截的就是index.jsp

@WebFilter("/test"); 拦截的就是/test

2.拦截某一个目录

@WebFilter("/user/*") 拦截/user下面的所有的资源

3.拦截指定后缀的资源

*.do *.jsp *.html

4.拦截所有的资源 /*

​
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
​
//精准拦截
//@WebFilter("/index.jsp")
//@WebFilter("/test")
//@WebFilter("/user/*")拦截/user下面所有的资源
//@WebFilter("*.jsp")//拦截后缀为.jsp都拦截
//@WebFilter("/*")//拦截所有的资源,讲案例的时候会用!!!
public class FilterDemo3 implements Filter {
    public void destroy() {
    }
​
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //chain.doFilter(req, resp);
    }
​
    public void init(FilterConfig config) throws ServletException {
​
    }
​
}
​

2.3.4拦截方式有哪些参数【了解】

@WebServlet() 有很多参数 比如 name value urlPatterns loadOnStartup

都不用

@WebFilter()也有参数

filterName value

dispatcherTypes属性是在转发的时候,拦截请求的次数
package com.qfedu.filter;
​
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
​
/*
* value 拦截哪些资源
*dispatcherTypes 和咱们转发有关  但是真实开发不用
*dispatcherTypes = {DispatcherType.REQUEST} 如果是这个参数,请求被拦截一次
* 因为转发在服务器中就是一次请求
* dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
* 如果是这个参数,请求被拦截俩次,转发到test.jsp这个页面也是需要被拦截
* */
@WebFilter(value = "/*", dispatcherTypes = {DispatcherType.REQUEST})
public class FilterDemo4 implements Filter {
    public void destroy() {
    }
​
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //请求被拦截
        System.out.println("请求被拦截");
        chain.doFilter(req, resp);
    }
​
    public void init(FilterConfig config) throws ServletException {
​
    }
​
}

2.3.5过滤器链【了解】

如果有多个过滤到底谁先执行呢?

多个过滤器的时候,执行的顺序是非常随意的,按照字符串进行比较,升序进行的

AFilter BFilter 是先AFilter 再BFilter

数字的话,先执行1 再执行2

FilterDemo5........ FilterDemo6...... FilterDemo6!!!! FilterDemo5 !!!!!

​
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
​
@WebFilter( "/*")
public class FilterDemo5 implements Filter {
    public void destroy() {
    }
​
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("FilterDemo5........");
        chain.doFilter(req, resp);
        System.out.println("FilterDemo5  !!!!!");
    }
​
    public void init(FilterConfig config) throws ServletException {
​
    }
​
}
 

3.过滤器的综合案例

大家使用网站都是什么样的网站,一输入网址就直接跳转到登录页面

大家想一下咱们今天上午写的那个东西,一进来是登录页面?不是的

咱们能不能你写一个请求,无论怎么写?都是进的登录页面?可以的

和咱们上午写的类似,但是加了过滤器,过滤所有的资源,只放行一个资源login.html

你的网站必须一上去就是登录页面!!!淘宝和京东是半功能性网站。咱们现在要求一进去就是一个登录页面。只是在Filte里面写几个if-else语句,啥时候放行啥时候不放行自己要清楚

页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆界面</title>
    <style>
        body{
            background-color: pink;
        }
        div{
            position: absolute;
            top: 30px;
            left: 500px;
        }
        .in1{
            width: 300px;
            height: 40px;
        }
        .in2{
            width: 100px;
            height: 30px;
        }
    </style>
</head>
<body>
<div>
    <form action="LoginServlet" method="post">
        姓&nbsp;&nbsp;名:<input type="text" name="username" class="in1"><br><br>
        密&nbsp;&nbsp;码:<input type="password" name="password" class="in1"><br><br>
        &nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" name="登录" value="登录" class="in2" style="position: absolute;left: 80px" >&nbsp;&nbsp;
        <input type="reset" name="重置" value="重置" class="in2" style="position: absolute;left: 250px">
    </form>
</div>
</body>
</html>

servlet层(一个LoginServlet 一个MainServlet 一个LoginFilter过滤器用来实现对不同页面访问出现效果都是登陆页面)

package com.javacoffee.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
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 {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
       //首先获取session对象 如果session为null,就到登录页面
        HttpSession session = ((HttpServletRequest)req).getSession();
        //然后获取统一资源标识符
        String requestURI = ((HttpServletRequest) req).getRequestURI();
        //登录相关的资源,不应该过滤的可以放行

        if (requestURI.endsWith("/Login.html")||requestURI.endsWith("/LoginServlet")) {
            chain.doFilter(req, resp);//可放行的
        }else if (session !=null && session.getAttribute("username")!=null){
            chain.doFilter(req,resp);
            //session不为空,且session里面的值也不为空,就方法,证明你登录过了!!!
            //放行
        }else if (session == null || session.getAttribute("username")==null){
            //不能放行,session为空,就证明你没有登录过,所以不能放行
            //跳转到登录页面
            ((HttpServletResponse)resp).sendRedirect("Login.html");
        }
    }

    public void init(FilterConfig config) throws ServletException {

    }

}
package com.javacoffee.servlet;

import com.javacoffee.dao.UserDao;
import com.javacoffee.enity.Person;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Object[] objects = {username,password};
        HttpSession session = request.getSession();
        String id = session.getId();
        Cookie cookie = new Cookie("JSESSIONID", id);
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
        UserDao userDao = new UserDao();
        try {
            List<Person> login = userDao.login(objects);
            if (login != null) {
                for (Person person : login) {
                    if (person != null) {
                        session.setAttribute("username", person.getUsername());
                        request.getRequestDispatcher("MainServlet").forward(request, response);
                    }
                }
            }
            request.getRequestDispatcher("/Login.html").forward(request,response);
        } catch (SQLException ignored) {

        }
    }
}
package com.javacoffee.servlet;

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

@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        HttpSession session = request.getSession(false);
        String html = "<font size = '6' color = 'red'>欢迎"+session.getAttribute("username")+"登陆成功";
        response.getWriter().append(html);
    }
}

最后的效果就是无论你怎么输入后缀网址 没登陆的时候都只会跳转到登陆界面

 登录后是这样,通过session会话控制获取上个页面的状态,登陆的用户密码数据在数据库中存储,至于怎么提取就不细说了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值