HttpBasic:
是RFC中定义的一种控制HTTP协议访问资源的方式。具体当HTTP请求受限资源时,就需要在请求头中添加以"Authorization"为key的header,value的具体形式是"Basic <credentials>", 其中<credentials>
是以“${username}:${password}"进行BASE64编码后的字符串。如果携带的这个请求头的信息和服务端保存
的用户名密码信息不匹配,就需要服务端必须返回401的状态码和WWW-Authenticate的返回头,其中值要形如
”Basic realm=testHttpBasic"其中”Basic realm"是固定死的
特性:
是最简单的控制访问方式,不需要cookies啊,session identifiers(session id)啊/login pages什么的。
各大浏览器都会以好RFC定义的约定规则实现对应的逻辑的。
 
实现:
SpringSecurity框架中就包含了HttpBasic的功能,但如果不想依赖这么重的玩意儿,可以自己写一个。
我是写了一个Filter,用于过滤请求,已通过Chrome浏览器验证Ok.
 package org.zeng.test.test.web.httpbasic;

 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;
import java.util.Base64; @WebFilter(servletNames = "authFilter", urlPatterns = "/basic/*")
public class AuthFilter implements Filter { private final String USERNAME = "admin";
private final String PASSWORD = "123456"; /**
* 核心逻辑比较简单,就是:
* 1.简单的字符串解析
* 2.解码Base64
* 3.验证用户名密码
* 4.将用户标识放入session中
*
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpSession session = request.getSession(); if (session.getAttribute("user") == null) {
String basicValue = request.getHeader("Authorization"); //打印出了值形如 "Basic YW423222222lalalla"
System.out.println("Authorization: " + basicValue); if (basicValue != null && basicValue.length() > 0) {
String[] authorizationValue = basicValue.split(" ");
if (authorizationValue.length == 2) { //获取到解码后的值,形如 "admin:123456"
String base64Encoded = new String(Base64.getDecoder().decode(authorizationValue[1]));
if (authorizationValue != null && base64Encoded.length() > 0) {
String userAndPwdArray[] = base64Encoded.split(":");
if (userAndPwdArray.length != 2) {
checkFailed(servletResponse);
} else {
String user = userAndPwdArray[0];
String password = userAndPwdArray[1];
if (USERNAME.equals(user) && PASSWORD.equals(password)) { //放入session中,下次登录无需再次提示登录框
session.setAttribute("user", USERNAME); checkSuccess(servletRequest, servletResponse, filterChain);
} else {
checkFailed(servletResponse);
}
}
} else {
checkFailed(servletResponse);
}
} else {
checkFailed(servletResponse);
}
} else {
checkFailed(servletResponse);
}
} else {
checkSuccess(servletRequest, servletResponse, filterChain);
}
} @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void destroy() { } /**
* 校验成功
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
private void checkSuccess(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, servletResponse);
} /**
* 校验失败返回
* @param servletResponse
*/
private void checkFailed(ServletResponse servletResponse) {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setStatus(401);
response.setHeader("WWW-Authenticate", "Basic realm=anything you can write!");
}
}

手工实现HttpBasic校验的更多相关文章

  1. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

    1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...

  2. Structs框架

    一.准备工作及实例 1.解压struts-2.1.6-all.zip(structs网上下载) apps目录:struts2自带的例子程序 docs目录:官方文档. lib 目录:存放所有jar文件. ...

  3. struts2表单验证

    1:采用手工编写代码实现. 通过继承ActionSupport类,然后重写vlidate方法,validate方法会校验跟execute同样签名的方法,当某个数据校验失败时,我们应该调用addFiel ...

  4. struts2.1.6教程八、验证机制

    注意:要想实现校验,action必须继承自ActionSupport类. 1.基于手工编码的校验 我们建立struts2validate项目 ,其中reg.jsp页面主要代码如下: <body& ...

  5. Struts2 实例(转载)

    一.准备工作及实例 1.解压struts-2.1.6-all.zip apps目录:struts2自带的例子程序docs目录:官方文档. lib 目录:存放所有jar文件. Src 目录:源文件存放地 ...

  6. 容器云平台使用体验:数人云Crane

    数人云在9月6日开通了容器管理面板Crane的试用活动,这是国内首个基于DockerSwarmKit的容器管理工具.它具有Docker原生编排功能,采用轻量化架构,帮助开发者快速搭建DevOps环境, ...

  7. struts_19_对Action中所有方法、某一个方法进行输入校验(手工编写代码实现输入校验)

    对所有方法进行校验1.通过手工编写代码的形式实现 需求:用户名:不能为空手机号:不能为空,并且要符合手机号的格式1,3/5/8,后面是9个数字 第01步:导包 第02步:配置web.xml <? ...

  8. struts2视频学习笔记 19-20(手工编写代码实现所有方法和指定方法校验)

    课时19 对Action中所有方法进行输入校验 1.手工编写代码实现对action中所有方法输入校验 通过重写validate() 方法实现, validate()方法会校验action中所有与exe ...

  9. Eclipse打开xml文件报校验错误解决办法

    XML文件在Eclipse中报校验错误: The content of element type "web-app" must match "(icon?,display ...

随机推荐

  1. 数据分析 - Excel 综合实例 - 杜邦分析法

    项目背景 杜邦分析法 利用 杜邦分析法完成对一份数据的动态分析 流程图如下 项目源数据 左侧为竖向的数据管理, 右侧为横向的数据管理 横向的数据管理在数据透视的时候会很不方便, 并不推荐 常用叫法左边 ...

  2. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_02-自定义查询页面-服务端-接口开发

    在Service中实现自定义查询 StringUtils.isNotEmpty()是这个包下的org.apache.commons.lang3.StringUtils; 再设置其他的条件 定义Exam ...

  3. 【网站部署】flask

    记录下常用的命令: nohup gunicorn --workers=2 --timeout=400 app:app &ps -ax scp -p ./***.h5 user@**.**.** ...

  4. array_splice 在数组某位置插入数据

    $arr=array('a','b','c','d','e','f','g');//目标数组 $i_arr=array(');//要插入的数组 $n=;//插入的位置 array_splice($ar ...

  5. Spring Cloud(5):服务路由(Zuul)

    Zuul简介 所有微服务之间的调用,都应该通过服务网关进行路由,服务网关充当服务与服务之间的中介.服务网关像交通警察一样指挥交通,将用户引导到目标微服务实例.服务网关还充当着应用程序内所有微服务调用的 ...

  6. 【leetcode_easy】530. Minimum Absolute Difference in BST

    problem 530. Minimum Absolute Difference in BST 参考 1. Leetcode_easy_530. Minimum Absolute Difference ...

  7. Java基础——接口和抽象类

    接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...

  8. 读rfc HTTP 协议

    这是IETF ( 国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF))制定的协议之一. 互联网工程任务组,成立于1985年底,是全球互联网最 ...

  9. 2019Java常见面试下

    1.集合的作用是什么? 数据的传送增.删.改.查.constainsAll,可以存放不同类型的对象. 2.集合的通用方法有那些?通用方法是什么?(操作) 集合List的遍历方法有: Iterator: ...

  10. C#实现隐藏手机号、邮箱、姓名等敏感信息扩展方法

    还是老惯例,直接上代码. 最终效果图: public static class HideSensitiveInfoExtension { /// <summary> /// 隐藏敏感信息 ...