session\cookie

一、session

1、基本使用

会话

在整个会话周期中任何servlet或者jsp页面都可以到会话的数据

设置数据

//将登录用户的信息存入到session中 HttpSession//获得session对象HttpSession session = req.getSession();session.setAttribute("loginUser", loginUser);

获取数据

在servlet中获取

HttpSession session = req.getSession();
session.getAttribute("loginUser");

在jsp页面获取

${sessionScope.loginUser.uname}
上面的代码实质就是下面两行代码
Users user = (Users)session.getAttribute("loginUser");
String uname = user.getUname();

2、登录的功能

每个用户必须登录以后才可以访问其他功能。

目前编写的登录没有实现这个功能。

需要添加代码来完成这个功能。

怎么完成?

登录完成后,在session存储登录用户的信息。没有登录成功,则session中没有存储登录用户信息

在所有的servlet中判断登录用户是否存在,如果存在允许访问,如果不存在,不允许访问。

a、在登录时将登录用户的信息存入session
private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {//1、获得表单中提交的数据String uname = req.getParameter("uname");String upwd = req.getParameter("upwd");Users user = new Users();user.setUname(uname);user.setUpwd(upwd);//2、调用service方法Users loginUser=us.login(user);//3、跳转if(loginUser!=null) {//将登录用户的信息存入到session中 HttpSession//获得session对象HttpSession session = req.getSession();session.setAttribute("loginUser", loginUser);resp.sendRedirect("emp.do");}else {resp.sendRedirect("login.html");}}
b、在所有要控制的servlet中添加控制代码
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//1、获得session对象HttpSession session = req.getSession();//2、获得session中的登录用户Users loginUser = (Users) session.getAttribute("loginUser");//3、判断登录用户是否存在,来决定你是否登录成功if(loginUser!=null) {String method = req.getParameter("method");if(method==null||method.equals("")) {method="query";}switch(method) {//          case "list"://              list(req,resp);//              break;case "query":query(req,resp);break;}}else {resp.sendRedirect("login.html");}}
c、如果用户使用完毕,需要退出登录
登录用户${sessionScope.loginUser.uname }<a href="exit.do">退出登录</a>

ExitServlet.java

package com.servlet;
​
import java.io.IOException;
​
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
public class ExitServlet extends HttpServlet {
​@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}
​@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//销毁sessionreq.getSession().invalidate();resp.sendRedirect("login.html");}}
​

二、过滤器

1、问题:

上面代码实现了session控制访问的功能,但是要在每个需要控制访问的servlet中编写判断代码,工作量太大,而且不好维护。

解决方案就是使用filter过滤器

2、编写过滤器类

LoginFilter.java

实现过滤器接口Filter javax.servlet.Filter

package com.filter;
​
import java.io.IOException;
​
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
​
import com.entity.Users;
​
public class LoginFilter implements Filter {
​@Overridepublic void destroy() {// TODO Auto-generated method stub
​}
​@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {//过滤器//编写代码 //arg0 request//arg1 response//将ServletRequest的arg0转成HttpServletRequest//(HttpServletRequest) arg0 说明arg0的类型大于HttpServletRequest类型//public abstract interface javax.servlet.http.HttpServletRequest extends javax.servlet.ServletRequest HttpServletRequest req = (HttpServletRequest) arg0;//获得sessionHttpSession session = req.getSession();//获得登录用户信息Users loginUser = (Users) session.getAttribute("loginUser");if(loginUser!=null) {//放行,也就是继续运行用户请求的内容arg2.doFilter(arg0, arg1);}else {HttpServletResponse resp = (HttpServletResponse) arg1;resp.sendRedirect("login.html");}​}
​@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub
​}
​
}
​
3、过滤器也需要在web.xml中配置
<filter><filter-name>loginFilter</filter-name><filter-class>com.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>loginFilter</filter-name><!-- 地址栏中所有的*.do请求都会被当前filter拦截--><url-pattern>*.do</url-pattern></filter-mapping>
4、过滤器就可以将所有*.do请求过滤

实际上就是在执行目标servlet中的代码前,执行过滤器代码

在其他servlet中就不用编写session控制访问的代码

实现字符集过滤器
a、编写过滤器
package com.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class EncodingFilter implements Filter {private String encoding;@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);//上面两行代码在所有被过滤的servlet中都加上了chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stubencoding = filterConfig.getInitParameter("encoding");}}
b、配置过滤器
<filter><filter-name>ef</filter-name><filter-class>com.filter.EncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>ef</filter-name><!-- 地址栏中所有的*.do请求都会被当前filter拦截--><url-pattern>*.do</url-pattern></filter-mapping>

三、Cookie

1、自动登录

自动登录多久,设置cookie失效时间

a、登录完成时,在UsersServlet中将登录成功的用户名和密码存入cookied中
//设定cookie的失效时间String timeStr = req.getParameter("time");
//如果没有传参,则默认不保存int t = 0;if(timeStr!=null) {t = Integer.parseInt(timeStr);}//将登录户名名称和密码存到cookie中//在服务器端生成cookie//cookie只能存入字符串,想要存入的信息有多个值,需要拼接存入Cookie cookie = new Cookie("loginUser", loginUser.getUname()+":"+loginUser.getUpwd());//设定失效时间cookie.setMaxAge(t);resp.addCookie(cookie);

package com.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com..entity.Users;
import com.service.UserService;
import com.service.UserServiceImpl;public class UsersServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		req.setCharacterEncoding("utf-8");
//		resp.setCharacterEncoding("utf-8");String method = req.getParameter("method");switch (method) {case "login":login(req,resp);break;default:break;}}UserService us = new UserServiceImpl();private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {//1、获得表单中提交的数据String uname = req.getParameter("uname");String upwd = req.getParameter("upwd");Users user = new Users();user.setUname(uname);user.setUpwd(upwd);//2、调用service方法Users loginUser=us.login(user);//3、跳转if(loginUser!=null) {//设定cookie的失效时间String timeStr = req.getParameter("time");int t = 0;if(timeStr!=null) {t = Integer.parseInt(timeStr);}//将登录户名名称和密码存到cookie中//在服务器端生成cookie//cookie只能存入字符串,想要存入的信息有多个值,需要拼接存入Cookie cookie = new Cookie("loginUser", loginUser.getUname()+":"+loginUser.getUpwd());cookie.setMaxAge(t);resp.addCookie(cookie);//将登录用户的信息存入到session中 HttpSession//获得session对象HttpSession session = req.getSession();//设定session的失效时间,参数为失效的秒数
//			session.setMaxInactiveInterval(5);session.setAttribute("loginUser", loginUser);resp.sendRedirect("emp.do");}else {resp.sendRedirect("login.html");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}}
b、因为登录界面需要使用java代码,所以将html转成jsp
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
<link rel="stylesheet" href="css/bootstrap.min.css" /><script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script><script type="text/javascript" src="js/bootstrap.min.js" ></script></head><body><%//实现自动登录Cookie[] cookies = request.getCookies();for(int i=0;i<cookies.length;i++){Cookie c = cookies[i];//判断cookie中是否存在登录用户信息,如果存在,则直接登录if(c.getName().equals("loginUser")){if(c.getValue()!=null&&!c.getValue().equals("")){String[] strs = c.getValue().split(":");//在重定向的时候直接将cookie中的登录用户信息分解传入登录servletresponse.sendRedirect("users.do?method=login&uname="+strs[0]+"&upwd="+strs[1]);}}}%><div class="panel panel-info col-md-6 col-md-offset-3"><div class="panel-heading h2">登录界面</div><div class="panel-body"><form class="form-horizontal" action="users.do?method=login" method="post"><div class="form-group"><label class="col-md-2 control-label" for="uname">用户名</label><div class="col-md-10"><input type="text" name="uname" id="uname" class="form-control" ></div></div><div class="form-group"><label class="col-md-2 control-label" for="upwd">密码</label><div class="col-md-10"><input type="password" name="upwd" id="upwd" class="form-control" ></div></div><select name="time"><option value="0">不保存</option><option value="10">保存一天</option><option value="30">保存一周</option><option value="300">保存一月</option></select><button class="btn btn-success btn-block">登录</button></form></div></div></body>
</html>

将所有跳转到login.html代码转成login.jsp

在LoginFilter和ExitServlet中修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么Spring Cloud 应用程序中,应用程序的加载配置必须写在bootstrap.yaml这个配置文件中,是在哪里规定的?

在 Spring Cloud 应用程序中&#xff0c;bootstrap.yaml&#xff08;或bootstrap.properties&#xff09;的使用并非强制性的&#xff0c;但它扮演着一个特定的角色&#xff0c;主要是因为 Spring Cloud 的设计和工作流程。 背景和设计 Spring Cloud 构建在 Spring Boot 之上…

鸿蒙 Stage模型-应用组件-配置、UIAbility

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 一、概念 可以看到分为运行期、编译器&#xff0c;主要关注UIAbility&#xff08;类似Activity&#xff0c;UI相关&#xff0…

2024年软考-官方最新考试安排出来了,软考新调整,很重要,但也很惹人气愤

官方最新通知&#xff0c;关于2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划 笔试改机考后&#xff0c;必然会迎来调整&#xff0c;但有点让人费解。 这次调整变动主要是每年考试的次数调整&#xff0c;很多改为了一年一考&#xff0c;具体…

Ansible playbook 简介 使用场景

Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系…

Claude 3 模型发布,压力来到OpenAI这边了~

Anthropic 发布了 Claude 3 系列&#xff0c;包含了三款模型 各具特色&#xff0c;旨在为用户提供更智能、更快速、更高效的选择&#xff0c;可以说是是迄今为止最快、最强大的人工模型&#xff01; Anthropic 一度是 OpenAI 最强力的竞争对手&#xff01; 随着 Claude3 的发…

云计算 3月5号 (DNS域名解析及部署)

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。…

408专业课130+|我的备考经验和复盘

408的四门课任务量多到爆炸&#xff01;但难度不止于此。别忘了大部分选计算机的勇士们&#xff0c;是要考数学的&#xff01;直接起飞。 408数学无疑是王炸王炸&#xff0c;要想上岸就一定要把这两个大头一起拿下&#xff01; 作为一个成功上岸的非计算机专业跨考生&#xf…

linux系统ELK组件介绍

ELK组件介绍 ELK组件介绍Elasticsearch&#xff1a;Logstash:Kibana:Kafka&#xff1a; Filebeat: ELK 官网地址&#xff1a;https://www.elastic.co 官网搭建&#xff1a;https://www.elastic.co/guide/index.html 组件介绍 Elasticsearch&#xff1a; 是一个基于Lucene的搜…

CSS全局样式的设置,web开发交流

面试题 HTML 1&#xff0c;html5有哪些新特性&#xff1f; 2&#xff0c;html5移除了那些元素&#xff1f; 3&#xff0c;如何处理HTML5新标签的浏览器兼容问题 戳这里领取完整开源项目&#xff1a;【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】…

【十一】【SQL】外连接(左外连接,右外连接)

数据库中的外连接&#xff08;Outer Join&#xff09;用于连接两个表&#xff0c;并包括两个表中的匹配行以及左表&#xff08;LEFT JOIN&#xff09;或右表&#xff08;RIGHT JOIN&#xff09;中未匹配的行。外连接分为两种主要类型&#xff1a; 左外连接&#xff08;LEFT OU…

如何用python实现Can总线通讯

今天去广交会参展, 里面关于工业, 有很多基于profinet、can等总线通讯协议的硬件网关, 好像总线协议一般都用于硬件嵌入式层面, 纯软方面很少涉及, 那如何使用python进行Can总线通讯呢? CAN(Controller Area Network)总线是一种常用于汽车和工业自动化中的通信协议。在…

day58 异常 IO流

异常 1异常处理机制 编译时错误 运行时错误 代码逻辑错误 2异常类结构图 java.lang.Throwable 所有异常的父类 只有它能剖出异常 java.lang.Error: extends Throwable 程序中的硬件严重问题不需要处理 java.lang.Exception extends Throwable 异常 指出要捕获的处理条件 3异常…

外贸独立站使用简站WordPress模板搭建的优势

在全球化的商业浪潮中&#xff0c;外贸独立站成为了企业走出国门、开拓国际市场的重要桥梁。而简站WordPress模板作为一种高效、便捷的建站工具&#xff0c;正受到越来越多外贸企业的青睐。本文将从多个方面分析使用简站WordPress模板搭建外贸独立站的优势。 一、快速搭建&…

深入理解现代JavaScript:从语言特性到应用实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 JavaScript作为一门动态、解释性脚本语言&…

网络工程师笔记8

华为VRP系统 设备管理方式 web管理方式 命令行管理方式 修改命令&#xff1a;undo 基础配置命令

001 概述

什么是API API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。为了…

INFINI Labs 产品更新 | Easysearch 1.7.1发布

INFINI Labs 产品又更新啦~&#xff0c;包括 Console&#xff0c;Gateway&#xff0c;Agent 1.23.0 和 Easysearch 1.7.1。此次版本重点修复历史遗留 Bug 、网友们提的一些需求等。以下是本次更新的详细说明。 INFINI Console v1.23.0 INFINI Console 是一款非常轻量级的多集…

express+mysql+vue,从零搭建一个商城管理系统9--添加商户

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建models/shop.js二、新建routes/shop.js三、修改routes下的index.js四、添加商户总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 一、新建models/shop.js models/shop.…

PortSwigger 基于dom的漏洞-利用 DOM 破坏来启用 XSS

进入实验随意进入一篇博客 我们可以尝试随意提交一些恶意代码看看会发生什么 很显然我们提交成功了但是我们的恶意代码貌似被过滤了 查看源码发现这里有一个过滤框架 我们打开源码分析 function loadComments(postCommentPath) {let xhr new XMLHttpRequest();xhr.onreadys…

#QT(串口助手-实现)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;在widget.h中加入必要文件&#xff0c;并且定义一个类指针 &#xff08;2&#xff09;如果有类的成员不知道怎么写&#xff0c;可以通过以下途径搜索 &#xff08;2&#xff09;设置串口数据 void Widget…