手机网站图片点击放大,加强教育信息网站建设,建筑公司网站关键词有哪些,wordpress后台仅显示当前主题1. 提要信息
1.1 java四类八种
在Java中#xff0c;四类指的是Java中的基本数据类型和引用数据类型#xff1a;
基本数据类型#xff1a;Java提供了八种基本数据类型#xff0c;包括整数型、浮点型、字符型和布尔型。引用数据类型#xff1a;指向对象的引用#xff0c…1. 提要信息
1.1 java四类八种
在Java中四类指的是Java中的基本数据类型和引用数据类型
基本数据类型Java提供了八种基本数据类型包括整数型、浮点型、字符型和布尔型。引用数据类型指向对象的引用如类、接口、数组等。特殊数据类型包括void类型和null类型。复合数据类型由基本数据类型和其他类型组合而成的类型如数组。
八种则是指Java中的基本数据类型
int32位整数范围是-2^31到2^31-1。short16位整数范围是-2^15到2^15-1。long64位整数范围是-2^63到2^63-1需要在数字后加上L或l。byte8位整数范围是-128到127。float32位浮点数用于表示小数。double64位浮点数精度比float高。char16位Unicode字符。boolean只有两个值true和false。
1.2 什么是请求头信息
请求头信息Request Headers是在HTTP请求中客户端向服务器发送的一系列键值对它们提供了关于请求本身的信息以及客户端环境和请求体的附加信息。请求头信息可以帮助服务器更好地理解请求的上下文并据此做出适当的响应。常见的请求头信息有Host、User-Agent、Accept等。
1.3 get与post请求的区别
POST适合发送大量数据和任意类型的数据不受字符类型限制。
GET适合发送少量数据且数据需要被编码为URL有效的格式。虽然理论上可以发送任何类型的数据但实际应用中通常用于发送简单的查询参数。
1.4 请描述重载和重写的区别
重载指的是在一个类中可以定义多个同名方法只要这些方法的参数列表不同参数的类型、数量或者顺序不同。重载方法可以有不同的返回类型也可以没有返回类型但它们的参数列表必须不同。
重写指的是在子类中重新定义父类的方法。重写的方法必须有相同的方法名、参数列表和返回类型。如果父类的方法被声明为final则不能被重写。
1.5 创建控制器类常用三种方式
1.实现Controller接口需要实现方法完成业务操作有局限性 2.使用Controller注解可以创建多个方法方法上设置RequestMapping访问地址响应数据格式需要自定义尤其JSON支持不是很完整
3.使用RestControl注解支持Rest请求方式内置了ResponseBody可以自动转换JSON
1.6 方法函数
方法的定义格式
访问权限限定符返回类型 方法名称参数列表{ 方法体} 例 public int addNumbers(int num1, int num2) { int sum num1 num2; return sum; } 共同点
都可以传递参数、都有返回值都是用于执行一个过程
不同点
函数通常是单独创建并被调用不需要前置条件如自定义四舍五入方法是类成员通常情况需要使用类对象调用在JAVA中只有方法没有函数。
2.令牌验证ArticleController
2.1 定义
书接上回文章结尾11.JWT令牌
我使用了login登录方法处理用户登录请求。它接收用户名和密码验证用户信息并在验证成功后生成一个JWT令牌。
下面将使用list方法处理获取用户信息的请求。它接收上方生成的JWT令牌验证令牌的有效性并根据令牌中的信息查询用户信息若令牌有效则给予放行反之拒绝访问。
2.2 令牌的生成与验证
login方法生成的JWT令牌在list方法中被验证。这是两个方法之间的直接关联。
login方法负责生成令牌而list方法负责验证令牌的有效性。
login方法通过用户名和密码验证用户身份而list方法通过验证JWT令牌来确认用户的身份。
2.3 具体操作
文件地址org/example/controller/ArticleController.java
RequestHeader获取请求头信息
package org.example.controller;import jakarta.servlet.http.HttpServletResponse;
import org.example.entity.Result;
import org.example.utils.JwtUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
RestController
RequestMapping(/article)
public class ArticleController {RequestMapping(/list)public ResultString list(RequestHeader(name Authorization)String token, HttpServletResponse response) {//验证tokentry{MapString,Object claims JwtUtil.parseToken(token);return Result.success(查询所有文章列表);}catch(Exception e){response.setStatus(401);//设置响应状态return Result.error(未登录);}}
}
2.4 效果演示 3.拦截器
3.1 定义
功能接收并拦截所有的请求
1.过程中检查用户是否已经登录以及是否拥有执行特定操作的权限。
2.在请求到达具体的业务逻辑处理之前拦截器可以对请求数据进行预处理如验证、格式化或转换。
3.2 函数操作LoginInterceptor
在example下创建org/example/interceptors/LoginInterceptor.java
拦截器的功能方法
request 请求对象客户端向服务器发送的数据包response响应对象服务端向客户端传递数据发送的数据包handler 头协议对象请求协议
package org.example.interceptors;
//登录拦截器
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.utils.JwtUtil;
import org.example.utils.ThreadLocalUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
Component //由Spring框架注册拦截器
public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌验证String token request.getHeader(Authorization);try{MapString,Object claims JwtUtil.parseToken(token);//拿到令牌后给予放行return true;}catch (Exception e){response.setStatus(401);return false;}}
}
3.3 拦截器的注册WebConfig
在example下创建org/example/config/WebConfig.java
在启动NewsApplication.java后优先加载该文件。
他是工程的一个配置类主要作用是拦截器的使用服务于用户首页。
package org.example.config;
import org.example.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
Configuration //工程启动即加载
public class WebConfig implements WebMvcConfigurer {Autowired //获得拦截器工具private LoginInterceptor loginInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {//登录接口、注册接口不拦截//excludePathPatterns不拦截方法registry.addInterceptor(loginInterceptor).excludePathPatterns(/user/login,/user/register);}
}3.4 返回ArticleController
既已配置了开局启动项目那么在后续的操作中便不必反复验证。
更改后的org/example/controller/ArticleController.java代码
package org.example.controller;
import jakarta.servlet.http.HttpServletResponse;
import org.example.entity.Result;
import org.example.utils.JwtUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
RestController
RequestMapping(/article)
public class ArticleController {RequestMapping(/list)public ResultString list() {//验证tokenreturn Result.success(所有文章数据);}
}
4.获取用户详细信息
1.控制层中编写方法userinfo 2.service和mapper中根据用户指令查询信息【已配置】
4.1 定义请求方法UserController
在org/example/controller/UserController.java中
定义了一个处理HTTP POST请求的方法userInfo 返回类型是Result
并获取token值token中装着用户名信息。
//详细信息PostMapping(/userinfo)public ResultUser userInfo(RequestHeader(name Authorization)String token){//从令牌中获得用户名MapString,Object map JwtUtil.parseToken(token);String username (String)map.get(username);//将获取的用户名转换成String字符串//查询用户对应的信息User user userService.findUserByUsername(username);return Result.success(user);}
4.2 配置忽略密码User
在org/example/entity/User.java中找到想要隐藏的项
在其上方设置忽略属性密码为例
JsonIgnore:配置springmvc把当前对象转换成json字符串的时候忽略password
JsonIgnore
private String password;
4.3 配置命名转换
数据库中的列名为下划线间隔实体映射类中的命名为驼峰命名。
针对这种无法匹配的情况在/resources/application.yml中配置自动命名转换。 mybatis: configuration: map-underscore-to-camel-case: true 4.4 ThreadLocal本地线程
作用确保数据不会混淆
4.4.1 线程测试
在test下新建类src/test/java/ThreadLocalTest.java
import org.junit.jupiter.api.Test;
public class ThreadLocalTest {Testvoid testThreadLocalSetAndGet() {//创建线程池用于存放用户信息ThreadLocal tl new ThreadLocal();new Thread(() - {tl.set(Adela); //在线程池中创建一个线程System.out.println(Thread.currentThread().getName():tl.get());System.out.println(Thread.currentThread().getName():tl.get());System.out.println(Thread.currentThread().getName():tl.get());},蓝色).start();new Thread(() - {tl.set(Hela); //在线程池中再创建一个线程System.out.println(Thread.currentThread().getName():tl.get());System.out.println(Thread.currentThread().getName():tl.get());System.out.println(Thread.currentThread().getName():tl.get());},黑色).start();}
}4.4.2 导入线程功能
于网络查找线程功能代码放在org/example/utils/ThreadLocalUtil.java中
package org.example.utils;
import java.util.HashMap;
import java.util.Map;
SuppressWarnings(all)
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL new ThreadLocal();//根据键获取值public static T T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}4.4.3 线程应用
返回org/example/interceptors/LoginInterceptor.java把拦截到的数据给到线程池中。
package org.example.interceptors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.utils.JwtUtil;
import org.example.utils.ThreadLocalUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
Component
public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token request.getHeader(Authorization);try{MapString,Object claims JwtUtil.parseToken(token);//把业务数据存储到ThreadLocal本地线程中ThreadLocalUtil.set(claims);return true;}catch (Exception e){response.setStatus(401);return false;}}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//清除线程中的数据ThreadLocalUtil.remove();}
}