精华内容
下载资源
问答
  • 1.对于jsp页面,需要在首页jsp页面添加如下: <% response.setHeader(“Pragma”,“no-cache”); response.setHeader(“Cache-Control”,“no-cache”); response.setDateHeader(“Expires”, 0); response.set...

    1.对于jsp页面,需要在首页jsp页面添加如下:

    <%
    response.setHeader(“Pragma”,“no-cache”);
    response.setHeader(“Cache-Control”,“no-cache”);
    response.setDateHeader(“Expires”, 0);
    response.setHeader(“Cache-Control”, “no-store”);
    %>
    这样,退出登录在按返回时,就会正常的被拦截器拦截!
    2.对于html页面,需要在登录页面login.html下加上

    	<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta http-equiv="Expires" content="0" />
    

    位置如图

    展开全文
  • 需要完成以下步骤:先来看我们要达到的效果————不...退出时,要清空session添加authMiddlewares,在session有效的情况下才能访问/home页面,否则调转到登录页面运行命令: deno run --allow-net --allow-read main...

    需要完成以下步骤:

    1. 先来看我们要达到的效果————不登录将不能访问/home首页.
    2. 登录和退出功能已经提前写好
    3. 添加session,登录成功后把员工信息放到session中.退出时,要清空session
    4. 添加authMiddlewares,在session有效的情况下才能访问/home页面,否则调转到登录页面
    5. 运行命令: deno run --allow-net --allow-read main.ts
    1024ba5003f2b3bce156843fc607fd09.png

    #controllers/controller.ts

    //引入后台REDIRECT
    import { Context, REDIRECT_BACK } from "https://deno.land/x/oak/mod.ts";
    //解析Form
    import { multiParser } from 'https://raw.githubusercontent.com/deligenius/multiparser/master/mod.ts'
    //引入员工列表
    import employees from "../models/employees.ts";
    //获取工程目录
    const { cwd } = Deno;

    class Controller {

        //默认登录页面
        static async login(ctx: any) {
            ctx.render(`${cwd()}/views/login.ejs`, {
                msg: ""
            });
        }

        //提交登录Action
        static async logon(ctx: any) {
            //获取员工登录信息
            const strLoginEmployee = JSON.stringify(await multiParser(ctx.request.serverRequest));
            const jsonLoginEmployee = JSON.parse(strLoginEmployee);
            //检查登录员工是否存在
            const hadEmployee = employees.find(employee => {
                return employee.username === jsonLoginEmployee.username && employee.password === jsonLoginEmployee.password;
            });

            //如果存在
            if (hadEmployee) {
                //把员工set到session里面
                await ctx.state.session.set("EMPLOYEE_SESSION", hadEmployee);
                ctx.response.redirect(REDIRECT_BACK, "/home");
            } else {
                //如果不存在,将在登录页面显示错误信息
                ctx.render(`${cwd()}/views/login.ejs`, {
                    msg: "用户名或密码错误"
                });
            }

        }

        //登录成功后跳转到首页
        static async home(ctx: any) {
            let sessionName: string = " is null";
            //获取session
            const hadEmployee = await ctx.state.session.get("EMPLOYEE_SESSION");
            //session 是否存在员工信息
            if (hadEmployee !== undefined) {
                sessionName = hadEmployee.username;
            }
            //再首页显示员工名称
            ctx.render(`${cwd()}/views/home.ejs`, {
                usersession: sessionName
            });
        }

        //退出登录
        static async logout(ctx: any) {
            //这里清空session
            await ctx.state.session.set("EMPLOYEE_SESSION"undefined);
            ctx.response.redirect(REDIRECT_BACK, "/");
        }

    }

    export default Controller;

    #middlewares/authMiddleware.ts


    import { Context,REDIRECT_BACK } from "https://deno.land/x/oak/mod.ts";

    //定义 authMiddleware 检查session有效性
    const authMiddleware = async (ctx: any, next: any) => {
       
        //检查session 是否存在
        const hadEmployee = await ctx.state.session.get("EMPLOYEE_SESSION");
        if(hadEmployee  !== undefined){
            await next();
            return;
        }
        //否则调到login页面
        ctx.response.redirect(REDIRECT_BACK, "/");
    }

    export default authMiddleware;

    #models/employee.ts

    //定义interface
    export interface Employee{
        id: string,
        username: string,
        password: string
    }

    //初始化员工列表
    const employees: Array =[
        { 
            id: "1",
            username: "admin",
            password: "123456"
        },
        {
            id: "2",
            username: "alex",
            password: "654321"
        }
    ]//导出export default employees;

    #routers/router.ts

    import { Router } from "https://deno.land/x/oak/mod.ts";
    import Controller from "../controllers/Controller.ts";
    import authMiddleware from "../middlewares/authMiddleware.ts";


    const router = new Router();

    //默认登录页面
    router.get("/",Controller.login);

    //点击登录按钮
    router.post("/logon",Controller.logon);

    //登录成功跳转到首页,如果session不存在,将跳转到登录页面
    router.get("/home",authMiddleware,Controller.home);

    //退出登录
    router.get("/logout",Controller.logout);

    export default router;

    #main.ts


    //引入Application,send组件
    import { Application, send } from "https://deno.land/x/oak/mod.ts"
    //显示页面,必须引入这3个功能
    import { viewEngine, engineFactory, adapterFactory } from "https://deno.land/x/view_engine/mod.ts";
    import router from "./routers/router.ts";
    import { Session } from "https://deno.land/x/session/mod.ts";

    //获取页面模板引擎,这里是ejs
    const ejsEngine = engineFactory.getEjsEngine();
    //获取oak适配器 oakAdapter
    const oakAdapter = adapterFactory.getOakAdapter();

    //创建app
    const app = new Application();

    //我们工程使用的是oak
    const session = new Session({ framework: "oak" });
    //初始化session
    await session.init();
    //引用session
    app.use(session.use()(session));

    //创建viewEngine并应用到app
    app.use(viewEngine(oakAdapter, ejsEngine));
    app.use(router.routes());
    app.use(router.allowedMethods());

    //必须加上静态文件所有在目录,例如static
    app.use(async ctx => {
        await send(ctx, ctx.request.url.pathname, {
            root: `${Deno.cwd()}/static`
        });
    });

    console.log("Server Port 8000");
    //端口
    await app.listen({ port: 8000 })


    #views/login.ejs


    <form action="/logon" enctype="multipart/form-data" method="POST">
        <div class="input-group mb-3">
            <input type="text" class="form-control" name="username" placeholder="username">
            <div class="input-group-append">
                <div class="input-group-text">
                    <span class="fas fa-envelope">span>
                div>
            div>
        div>
        <div class="input-group mb-3">
            <input type="password" class="form-control" name="password" placeholder="Password">
            <div class="input-group-append">
                <div class="input-group-text">
                    <span class="fas fa-lock">span>
                div>
            div>
        div>
        <div class="row">
            <div class="col-8">
                <div class="icheck-primary">

                div>
            div>
            
            <div class="col-4">
                <button type="submit" class="btn btn-primary btn-block">Sign Inbutton>
            div>
            
        div>
    form>

    展开全文
  • 一起来完成以下步骤: 先来看我们要达到的效果————不登录将不...退出时,要清空session 添加authMiddlewares,在session有效的情况下才能访问/home页面,否则调转到登录页面 运行命令: deno run --all

    视频演示:https://www.bilibili.com/video/BV1BT4y1E7Nh/?p=13

    一起来完成以下步骤:

    1. 先来看我们要达到的效果————不登录将不能访问/home首页.

    2. 登录和退出功能已经提前写好

    3. 添加session,登录成功后把员工信息放到session中.退出时,要清空session

    4. 添加authMiddlewares,在session有效的情况下才能访问/home页面,否则调转到登录页面

    5. 运行命令: deno run --allow-net --allow-read main.ts

    #controllers/controller.ts

    //引入后台REDIRECT
    import { Context, REDIRECT_BACK } from "https://deno.land/x/oak/mod.ts";
    //解析Form
    import { multiParser } from 'https://raw.githubusercontent.com/deligenius/multiparser/master/mod.ts'
    //引入员工列表
    import employees from "../models/employees.ts";
    //获取工程目录
    const { cwd } = Deno;
    
    class Controller {
    
        //默认登录页面
        static async login(ctx: any) {
            ctx.render(`${cwd()}/views/login.ejs`, {
                msg: ""
            });
        }
    
        //提交登录Action
        static async logon(ctx: any) {
            //获取员工登录信息
            const strLoginEmployee = JSON.stringify(await multiParser(ctx.request.serverRequest));
            const jsonLoginEmployee = JSON.parse(strLoginEmployee);
            //检查登录员工是否存在
            const hadEmployee = employees.find(employee => {
                return employee.username === jsonLoginEmployee.username && employee.password === jsonLoginEmployee.password;
            });
    
            //如果存在
            if (hadEmployee) {
                //把员工set到session里面
                await ctx.state.session.set("EMPLOYEE_SESSION", hadEmployee);
                ctx.response.redirect(REDIRECT_BACK, "/home");
            } else {
                //如果不存在,将在登录页面显示错误信息
                ctx.render(`${cwd()}/views/login.ejs`, {
                    msg: "用户名或密码错误"
                });
            }
    
        }
    
        //登录成功后跳转到首页
        static async home(ctx: any) {
            let sessionName: string = " is null";
            //获取session
            const hadEmployee = await ctx.state.session.get("EMPLOYEE_SESSION");
            //session 是否存在员工信息
            if (hadEmployee !== undefined) {
                sessionName = hadEmployee.username;
            }
            //再首页显示员工名称
            ctx.render(`${cwd()}/views/home.ejs`, {
                usersession: sessionName
            });
        }
    
        //退出登录
        static async logout(ctx: any) {
            //这里清空session
            await ctx.state.session.set("EMPLOYEE_SESSION", undefined);
            ctx.response.redirect(REDIRECT_BACK, "/");
        }
    
    }
    
    export default Controller;
    

    #middlewares/authMiddleware.ts

    
    import { Context,REDIRECT_BACK } from "https://deno.land/x/oak/mod.ts";
    
    //定义 authMiddleware 检查session有效性
    const authMiddleware = async (ctx: any, next: any) => {
       
        //检查session 是否存在
        const hadEmployee = await ctx.state.session.get("EMPLOYEE_SESSION");
        if(hadEmployee  !== undefined){
            await next();
            return;
        }
        //否则调到login页面
        ctx.response.redirect(REDIRECT_BACK, "/");
    }
    
    export default authMiddleware;
    
    

    #models/employee.ts

    //定义interface
    export interface Employee{
        id: string,
        username: string,
        password: string
    }
    
    //初始化员工列表
    const employees: Array<Employee> =[
        { 
            id: "1",
            username: "admin",
            password: "123456"
        },
        {
            id: "2",
            username: "alex",
            password: "654321"
        }
    ]
    //导出
    export default employees;
    

    #routers/router.ts

    import { Router } from "https://deno.land/x/oak/mod.ts";
    import Controller from "../controllers/Controller.ts";
    import authMiddleware from "../middlewares/authMiddleware.ts";
    
    
    const router = new Router();
    
    //默认登录页面
    router.get("/",Controller.login);
    
    //点击登录按钮
    router.post("/logon",Controller.logon);
    
    //登录成功跳转到首页,如果session不存在,将跳转到登录页面
    router.get("/home",authMiddleware,Controller.home);
    
    //退出登录
    router.get("/logout",Controller.logout);
    
    export default router;
    
    

    #main.ts

    
    //引入Application,send组件
    import { Application, send } from "https://deno.land/x/oak/mod.ts"
    //显示页面,必须引入这3个功能
    import { viewEngine, engineFactory, adapterFactory } from "https://deno.land/x/view_engine/mod.ts";
    import router from "./routers/router.ts";
    import { Session } from "https://deno.land/x/session/mod.ts";
    
    //获取页面模板引擎,这里是ejs
    const ejsEngine = engineFactory.getEjsEngine();
    //获取oak适配器 oakAdapter
    const oakAdapter = adapterFactory.getOakAdapter();
    
    //创建app
    const app = new Application();
    
    //我们工程使用的是oak
    const session = new Session({ framework: "oak" });
    //初始化session
    await session.init();
    //引用session
    app.use(session.use()(session));
    
    //创建viewEngine并应用到app
    app.use(viewEngine(oakAdapter, ejsEngine));
    app.use(router.routes());
    app.use(router.allowedMethods());
    
    //必须加上静态文件所有在目录,例如static
    app.use(async ctx => {
        await send(ctx, ctx.request.url.pathname, {
            root: `${Deno.cwd()}/static`
        });
    });
    
    console.log("Server Port 8000");
    //端口
    await app.listen({ port: 8000 })
    
    
    

    #views/login.ejs

    
    <form action="/logon" enctype="multipart/form-data" method="POST">
        <div class="input-group mb-3">
            <input type="text" class="form-control" name="username" placeholder="username">
            <div class="input-group-append">
                <div class="input-group-text">
                    <span class="fas fa-envelope"></span>
                </div>
            </div>
        </div>
        <div class="input-group mb-3">
            <input type="password" class="form-control" name="password" placeholder="Password">
            <div class="input-group-append">
                <div class="input-group-text">
                    <span class="fas fa-lock"></span>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-8">
                <div class="icheck-primary">
    
                </div>
            </div>
            <!-- /.col -->
            <div class="col-4">
                <button type="submit" class="btn btn-primary btn-block">Sign In</button>
            </div>
            <!-- /.col -->
        </div>
    </form>
    
    

     

    展开全文
  • 由Servlet传递Session数据(“msg”,“提示信息”)至JSP页面,为保证刷新不再重复加载Session数据,需进行清空;但考虑到JSP<%%>只执行一次,所以需要将Session数据存储为page数据,再进行页面部分的展示,...

    开发Tip


    (一)返回首页时输出提示信息(单次)
    由Servlet传递Session数据(“msg”,“提示信息”)至JSP页面,为保证刷新不再重复加载Session数据,需进行清空;但考虑到JSP<%%>只执行一次,所以需要将Session数据存储为page数据,再进行页面部分的展示,同时对Session数据进行清空。如果需要展示N次,则Session传递时增加计数器N,每执行一次JSP→N–。
    在这里插入图片描述
    (二)CSS
    编写CSS样式时ID.Class数量较多,容易混淆对应关系。

    • 通过div标签的background-color进行区别
    • 为每一个CSS样式增加中文备注

    (三)HTML判断字符串为空
    应使用var!== "",不能使用var!== null

    (四)关于转发和重定向
    无论转发还是重定向访问目标,均会重新加载当前页面!

    • 转发(forward)访问目标:不需要增加虚拟目录
    • 重定向访问目标(sendRedirect):需要增加虚拟目录

    (五)关于判断字符串是否相等

    String A = "A";
    String B = null;
    A.equal(B);//false
    B.equal(A);//报错
    

    (六)文件路径
    为防止请求转发后,导致路径变更,进而导致引入的外部文件失效,需要将URL设置为${pageContext.request.contextPath},获得相对路径。

    (七)MySQL限制
    MySQL中,汉字的占用宽度与编码相关:
    UTF-8:3个字节
    GBK:2个字节

    展开全文
  • 当用户点击退出按钮后,浏览器发送一个 http 请求给服务器 服务器清空用户的 session 信息 删除 cookie 中用户名 然后把页面重定向到首页
  • 问题场景:新版微信会自动清空cookie,导致每天都要重新登录 解决思路:后端是通过session来获取用户是否登录,而session信息会存在客户端的cookie里面,然后每次请求接口的时候。又会自动带上cookie上面的信息,传...
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空
  • 调用打开摄像头后,聚焦后拍照,点击确认,这时页面会出现刷新动作,然后回退到网站一开始进入的首页,同时localstorage,session,cookie保存的内容都会被清空。 参考文章:...
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在....但是还有一个问题就是要知道用户...刚好当用户session值失效的时候该用户在cache里面的信息也会被清空
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否...这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空
  • 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在....但是还有一个问题就是要知道...刚好当用户session值失效的时候该用户在cache里面的信息也会被清空....

空空如也

空空如也

1 2 3 4 5
收藏数 97
精华内容 38
关键字:

首页清空session