authentication java_HTTP基本认证(Basic Authentication)的JAVA实例代码

大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。

但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证。

6908a886f0d8b3035d2ce7cc8c13cdb9.png

下面来看看一看这个认证的工作过程:

第一步:客户端发送http request 给服务器,服务器验证该用户是否已经登录验证过了,如果没有的话,

服务器会返回一个401 Unauthozied给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息。

如下图。

935ec5479bcd2da4f379cb156aa83f84.png

65e6eddeb182ca5fec0ca54f2513507f.png

第三步: 服务器将Authorization header中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端。

下面来看一个JAVA的示例代码

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Decoder;public classHTTPAuthServlet extends HttpServlet {public voiddoGet(HttpServletRequest request, HttpServletResponse response) throws IOException {if (!BasicAuthenticationUtil.checkUserAuth(request, "basicAuth")) {if (!BasicAuthenticationUtil.checkHeaderAuth(request, "basicAuth")) {

response.setStatus(401);

response.setHeader("Cache-Control", "no-store");

response.setDateHeader("Expires", 0);

response.setHeader("WWW-authenticate", "Basic Realm=\"test\"");return null;

}

}//验证通过后

String client = request.getParameter("client");if(StringUtils.isBlank(client)) {

//......}//其他操作....

}public voiddoPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

doGet(request, response);

}

}

BasicAuthenticationUtil 帮助类

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;

import org.jfree.util.Log;

import sun.misc.*;/**

* basic Auth 认证方式

*

* @author Geely

**/

public classBasicAuthenticationUtil {/**

*

* @param request

* @param response

* @param sessionName

* @return*/

public staticboolean checkHeaderAuth(HttpServletRequest request, String sessionName) {

String authorization= request.getHeader("Authorization");if ((authorization != null) && (authorization.length() > 6)) {

authorization= authorization.substring(6, authorization.length());

String decodedAuth=base64Decode(authorization);if(StringUtil.isNotBlank(sessionName)) {

request.getSession().setAttribute(sessionName, decodedAuth);

}return true;

}return false;

}/**

*

* @param request

* @param response

* @param sessionName

* @return*/

public staticboolean checkUserAuth(HttpServletRequest request, String sessionName) {

String sessionAuth= null;if(StringUtil.isNotBlank(sessionName)) {

sessionAuth=(String) request.getSession().getAttribute(sessionName);

}if (sessionAuth != null) {

Log.info("this is next step");return true;

}return false;

}/**

* 编码

*

* @param bstr

* @return String*/@SuppressWarnings("restriction")public static String base64Encode(byte[] bstr) {

String strEncode= newBASE64Encoder().encode(bstr);returnstrEncode;

}/**

* 解码

*

* @param str

* @return*/@SuppressWarnings("restriction")public staticString base64Decode(String str) {if(StringUtil.isBlank(str)) {return null;

}

String s= null;try{

BASE64Decoder decoder= newBASE64Decoder();byte[] b =decoder.decodeBuffer(str);

s= new String(b, "UTF8");

}catch(UnsupportedEncodingException e) {//TODO Auto-generated catch block

s = null;

}catch(IOException e) {//TODO Auto-generated catch block

s = null;

}returns;

}

}

当request第一次到达服务器时,服务器没有认证的信息,服务器会返回一个401 Unauthozied给客户端。

认证之后将认证信息放在session,以后在session有效期内就不用再认证了。

以上就是HTTP基本认证(Basic Authentication)的JAVA实例代码全部内容

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

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

相关文章

Python数据分析入门(四)

前言上期给大家分享了关于豆瓣5500部电视剧的分析,那么这次我们就给吃货们带来一些福利,此次我们的主题为“寻找最好吃的火锅”。进入主题之前,先给所有的吃货们带来一桌美味的火锅,作为各位看官的前菜。数据采集此次我们采集的是…

微信开发者工具下载

https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

java continue goto_Java中goto和break、continue实现区别

goto 关键字很早就在程序设计语言中出现。事实上,goto 是汇编语言的程序控制结构的始祖:“若条件 A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就会发现程序控制里包含了许多跳转。然而&#…

Linux VirtualBox安装及使用指南

2019独角兽企业重金招聘Python工程师标准>>> VirtualBox是一款虚拟机软件。虽然它的功能并不及VMware Workstation Pro,但它对开源精神的坚持使得它在Linux中依然深受欢迎。 唯一难以令人接受的是,VirtualBox的安装步骤较为复杂。不过&#x…

java web vm_java web .vm文件??

在JavaWeb项目中有很多.vm文件,打开以后是类似于.NETMVC项目中的.cshtml文件的形式#if($linkList)#set($itemsOnLine0)#foreach($linkin...在Java Web项目中有很多.vm文件,打开以后是类似于.NET MVC项目中的.cshtml文件的形式#if($linkList)#set ($items…

Android studio gradle 无法获取 pom文件

Android studio 3.1 导入app项目后,gradle无法获取 pom文件 具体保存内容如下: Could not GET https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-g…

生产环境linux下安装两个及两个以上tomcat实践

前言: 在生产环境部署程序项目中,有时候由于服务器紧张或缺少服务器等原因,往往都需要安装两个及两个以上tomcat。我们需要在/etc/profile中增加tomcat的环境变量,然后在新增加的tomcat的bin目录下的catalina.sh中引用自己在/etc/profile中配置的环境变量…

java 内存 四_java最终化的内存保留问题(4)

四、一种代替最终化的选择在前面一节中的示例还存在一种不确定性可能:JVM并不能保证它在最终化队列中调用对象的终结器的顺序。而来自于所有类(应用程序,库,等等)的终结器都是被同等对待的。因此,一个占有大量内存或一种稀有的本地…

基于Spring Boot不同的环境使用不同的配置方法

原文路径:http://www.jb51.net/article/132589.htm ---------------------------------------- 默认是profile为dev,可以修改 spring 多文件配置: 1、properties文件 2、YAML文件 一、properties文件 在 Spring Boot 中, 多环境配…

java set方法赋值_java方面:private属性,没有set方法,只有get方法,如何给这个属性赋值?...

富国沪深用反射吧,然后设置setAccessible为true就可以了,如下:public class Test {private String readOnly;public String getReadOnly() {return readOnly;}public static void main(String[] args) throws SecurityException, NoSuchField…

SpringBoot项目在IntelliJ IDEA中实现热部署

spring-boot项目热部署idea工具&#xff1a; &#xff08;1&#xff09;、pom文件引入&#xff1a;都需要为true<!-- 热部署模块 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId…

java nio 对消息分片_Java NIO:应用

Java NIO 是一种非阻塞的、面向块而非字节的 IO 方式。虽然 Java 的传统 IO 也进行了一些基于 NIO 的改造&#xff0c;NIO 仍然能够带来许多优势。面向流的 IO 方便我们一个字节一个字节地处理数据&#xff0c;有利于实现过滤等功能&#xff0c;更加优雅和简单。相应地&#xf…

使用Notepad++来比较文件

原文连接&#xff1a;https://blog.csdn.net/sanqima/article/details/50467154 -----------------------------------------------------------------------------Notepad&#xff0c;也叫npp&#xff0c;是一款类似于记事本的开源小软件。它运行便携&#xff0c;体积小、资源…

利用lamda函数 的函数式编程 实现scrapy审计外网安全问题

2019独角兽企业重金招聘Python工程师标准>>> import scrapy from scrapy.spiders import Spiderdef parse_response(response, ip_in):title response.xpath("/html/head/title").extract()[0]filename quotes.txtwith open(filename, a) as f:f.write(…

Linux服务器上新增开放端口号

原文连接&#xff1a; https://blog.csdn.net/u012562106/article/details/52882666 ---------------------------------------开放端口的方法&#xff1a; 方法一&#xff1a;命令行方式 1. 开放端口命令&#xff1a; /sbin/iptables -I INPUT -p tcp --dport 8…

return ,continue,break的用法与区别总结

1、return 语句的作用 (1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行。 (2) return 返回一个值给调用该方法的语句&#xff0c;返回值的数据类型必须与方法的声明中的返回值的类型一致&#xff0c;可以使用强制类型转换来是数据类型一致。 (…

linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?

我的问题是 Headers &#xff0c;我通过搜索获得了一些知识&#xff1a;但还是不知道为什么&#xff0c;有些可以提供一些帮助吗&#xff1f;这是我在Ubuntu12.04(64位)上的测试运行JDK 1.7.0_04 . 和顶部显示如下&#xff1a;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME CO…

Jquery的一些方法

$.trim(str);说明&#xff1a;去掉字符串首尾空格。转载于:https://www.cnblogs.com/gygtech/p/9552538.html

清除nginx服务器网站缓存数据

原文连接&#xff1a;https://blog.csdn.net/Crabime/article/details/51883028?locationNum2&fps1 -------------------------------------公司网站上线之后后面老是出现一些小的bug&#xff0c;但是这些bug在vi上改了之后打开更改的网页却发现并没有更改&#xff0c;goo…

linux安装指定版本python_ubuntu多版本python为指定版本python安装库

当安装了多个版本的Python时&#xff0c;比如一个python2.7&#xff0c;一个python3.5&#xff0c;需要为某个python版本安装库时如何精准的指定python版本呢。网上多数回答都是用到pyenv、virtualenv之类&#xff0c;看了下感觉跟我的预期不一致。因为PyCharm已经可以管理多个…