(十四)用session和过滤器方法检验用户是否登录
一、session方法
1.1 编写登录页面文件(index.html)
<!doctype html>
<html>
<head>
<title>测试style标签中的media属性</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8"> </style>
</head>
<body>
<form action="servlet/login" method="post">
用户名:<input type="text" name="userName" ><br/>
密 码:<input type="password" name="passWd" /><br/>
<input type="submit" />
</form>
</body>
</html>
1.2 表单提交之后,验证是否登陆正确,如果正确则记住登陆成功状态并跳转到主页。(LoginServlet.java《urlpattin=servlet/login》)
package servlet; import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
Properties pro=new Properties();
InputStream in=this.getClass().getResourceAsStream("userInfo/userInfo.properties"); //从配置文件中取出配置文件的输入流
pro.load(in); //把输入流加载到Pro对象中,pro对象就可以操作流的数据。这里的userInfo.properties里的userName=admin passWd=123520 //拿到注册用户帐号密码 进行对比
String userName=pro.getProperty("userName");
String passWd=pro.getProperty("passWd"); if(userName.equals(request.getParameter("userName"))){ //用户名正确 if(passWd.equals(request.getParameter("passWd"))){ //验证密码 //记录登录成功状态
request.getSession().setAttribute("login", "ok");
out.println("登录成功<br/>");
out.print("<a href='./main'>点我去主页</a>"); //如果信息正确,跳转到servlet,在这个servlet里检验login属性,如果是登录的loing=ok,
// 如果是直接输入url没有登陆过的loing=null
}else{
out.println("密码错误<br/>");
out.print("<a href='../index.html'>点我返回</a>");
} }else{
out.println("用户名错误<br/>");
out.print("<a href='../index.html'>点我返回</a>");
} } }
解析: 当用户提交表单后需要验证用户信息是否正确,如果正确则添加登录成功状态并跳转到主页,如果不正确则返回重新输入信息。
1.3 当用户输入信息正确后,跳转到servlet,然后在servlet里检验是否已经登录过,即检查session里有没有登录成功的属性值。
- 编写MainServlet.java文件(urlpatting=servlet/main)
package servlet; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class MainServlet
*/
public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public MainServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //拿到serssion中的login值
String loginStatues=(String) request.getSession().getAttribute("login"); if("ok".equals(loginStatues)){ //登录过 request.getRequestDispatcher("../html/main.html").forward(request, response); // }
if(loginStatues==null){
response.sendRedirect("../index.html");
} }
}
- 主页(main.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
主页
</body>
</html>
结果:





- 总结:用session记住登录状态来验证是否登录过的问题,但用户填好用户名密码发送到LoginServlet的时候,这个loginServlet主要用于检验用户输入的帐号密码是否正确,如果正确则说明登录成功此时需要记住登陆成功状态,即在session的attribute里设置login=ok,说明登录过,然后在跳转到MainServlet,MainServlet用于检验登录状态,即login是否等于ok,如果有则说明登录过那么直接跳转到主页即可,如果没有就跳转到登录页面重新登录即可。 这样就可以防止用户越过登陆页面访问主页。
二、利用过滤器技术实现验证用户是否登录
2.1 编写登录页面(index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="servlet/login" method="post" >
用户名:<input type="text" name="userName" /><br/>
密 码:<input type="password" name="passWd" /><br/>
<input type="submit" /></form>
</body>
</html>
2.2 编写LoginServlet.java ,这个servlet用于验证用户输入的用户名密码是否正确,如果正确则添加登陆成功状态。(urlpatting=servlet/login)
package servlet; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName=request.getParameter("userName");
String passWd=request.getParameter("passWd"); if("admin".equals(userName)){ //检查用户名
if("123520".equals(passWd)){ //检查密码 request.getSession().setAttribute("login", "ok"); //添加登陆成功状态的标识
request.getRequestDispatcher("/main").forward(request, response); //跳转到主页 }else{
System.out.println("密码错误");
} }else{
response.sendRedirect("../index.html"); //
}
}
}
2.3 编写主页页面(MainServlet.java)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.print("欢迎登录主页");
}
2.4 编写过滤器(LoginFilter.java)
package 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; /**
* Servlet Filter implementation class LoginFilter
*/
public class LoginFilter implements Filter { /**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request; //如果不转为HttpServletRequest则无法使用getsession()方法得到session里值。
HttpServletResponse res=(HttpServletResponse)response; Object login=req.getSession().getAttribute("login"); if(!req.getRequestURI().endsWith("index.html") && !req.getRequestURI().endsWith("servlet/login") ){ //如果用户访问的是登录页面(index)或者填好表单正要发送到servlet/login里验证登录(此时等待验证所以没有login=ok的属性值),则直接放行。
//如果访问的不是这两种,那么需要对用户进行检验是否登陆过。 if(login==null || !(login.equals("ok"))){
res.sendRedirect("index.html");
return;
} } chain.doFilter(request, response); //如果用户访问的是index.html和servlet/login,直接放行。
} public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} }
注意:req.getRequestURI().endsWith("servlet/login") 获取用户request请求的URL中以servlet/login结尾的页面,其结尾是指项目名后面的路径,即本例中URL为“localhost:8080/text1/servlet/login” 故结尾为“servlet/login”。
(十四)用session和过滤器方法检验用户是否登录的更多相关文章
- python接口自动化(十四)--session关联接口(详解)
简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...
- mysql进阶(二十四)防御SQL注入的方法总结
防御SQL注入的方法总结 这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下. SQL注入是一类危害极大的攻击形式.虽然危害很大,但是防御却 ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 十四 web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
打码接口文件 # -*- coding: cp936 -*- import sys import os from ctypes import * # 下载接口放目录 http://www.yundam ...
- CentOS 6.4 升级 Mysq5.5l方法 和 用户远程登录数据库
一:.在这里我们都知道 系统的yum源Mysql版本一般都是5.1 5.2的比较多 但是有些程序 必须要5.5以上的版本才能支持 这时候我们应该怎么办呢 编译安装也太慢 太费时间 那么我们就必要要 ...
- cookie、session及实现记住密码,自动登录
在登录帐号.密码框下,有三种帐号登录模式可供选择,用户可根据自己的具体情况选择其中一种适合自己的模式. 1.网吧模式:勾选网吧模式后,登录的帐号会在歪歪注销/退出的时候自动清除,不会留在登录框中,可以 ...
- Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持
Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗.嗅探.dns欺骗.session劫持 文/玄魂 目录 Kali Linux Web 渗透测试—第十四课-arp欺骗.嗅探.dns欺 ...
- 中文翻译:pjsip文档(四)之ICE Session的使用方法
1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
随机推荐
- Robot Framework--接口测试中常见的四种POST方式
写接口测试用例时,遇到以json格式提交数据时,报错,Request如下图: Response如下图: 改成form格式提交,可以正常运行,如下图: 代码如下: ------------------- ...
- vue router.beforeEach(),详解
outer.beforeEach()一般用来做一些进入页面的限制. 比如没有登录, 就不能进入某些页面,只有登录了之后才有权限查看某些页面...说白了就是路由拦截.第一步 规定进入路由需不需要权限 @ ...
- BZOJ 1181: [CROATIAN2009] IZBROI选举(二分+dp)
题面 在一个地区的选举中,共有V个人参加了投票,每一票只可能投给N个政党中的一个.当地的议会共有M个席位.不妨将N个政党编号为1到N,并且设编号为i的政党最终的得票为Vi,则议会中的席位按如下规则分配 ...
- NO.24两两交换链表中的节点
NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...
- exam8.29
咕了好几篇后... 我终于开始重新写了 T1: 不会,没思路,暴搜还可能会(一开始我以为暴搜时间复杂度为$\Theta (mn ^ k)$) 于是码出了暴搜... 跑一遍$(4,4,5)$,然后... ...
- link cut tree 洞穴勘测
/*[bzoj2049][Sdoi2008]Cave 洞穴勘测 2014年7月30日1,06923Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区 . ...
- Hdu CRB and Queries(整体二分)
CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...
- YII框架的类自动加载机制
YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现. 先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法 public stati ...
- Scrapy 教程(11)-API启动爬虫
scarpy 不仅提供了 scrapy crawl spider 命令来启动爬虫,还提供了一种利用 API 编写脚本 来启动爬虫的方法. scrapy 基于 twisted 异步网络库构建的,因此需要 ...
- indexOf的用法
A.indexOf(B)="-1"表示的是不存在 不等于-1就表示存在 http://www.w3school.com.cn/jsref/jsref_indexOf.asp 没有出 ...