HttpServletRequest + HttpServletResponse + poi-ooxml+SpringBoot异步

HttpServletResponse、HttpServletRequest

Web服务器收到每一次http请求,都会创建一个request对象、response对象。
request:        获取客户机提交过来的数据。
response:     向客户机输出数据。

四大作用域

从小到大顺序为:page  request  session  application
page:            页面,只能作用于本网页
request:        请求,只要不重定向,请求就会一直带到下一个页面
session:        会话,只要网页不关闭,session就不会丢失
application:   应用,只要服务器不关闭,application就不会丢失

HttpServletRequest 

request获取请求头数据

long getDateHeader(String name)
String getHeader(String name):获取指定名称的请求头;
Enumeration getHeaderNames():获取所有请求头名称;
Enumeration getHeaders(String name):获取指定请求头名称;
int getIntHeader(String name):获取值为int类型的请求头。

request获取请求相关的其它方法

int getContentLength()                    获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
String getContentType()                   获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
String getMethod()                        返回请求方法,例如:GET
Locale getLocale()                        返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
String getCharacterEncoding()             获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
void setCharacterEncoding(String code)    设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
String getContextPath()                   返回上下文路径,例如:/hello
String getQueryString()                   返回请求URL中的参数,例如:name=zhangSan
String getRequestURI()                    返回请求URI路径,例如:/hello/oneServlet
StringBuffer getRequestURL()              返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
String getServletPath()                   返回Servlet路径,例如:/oneServlet
String getRemoteAddr()                    返回当前客户端的IP地址;
String getRemoteHost()                    返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
String getScheme()                        返回请求协议,例如:http;
String getServerName()                    返回主机名,例如:localhost
int getServerPort()                       返回服务器端口号,例如:8080
String getParameter(String name)          通过指定名称获取参数值;
String[] getParameterValues(String name)  通过指定名称获取参数值数组,有可能一个名字对应多个值,例如表单中的多个复选框使用相同的name时
Enumeration getParameterNames()           获取所有参数的名字
Map getParameterMap()                     方法返回Map类型,对应所有参数。其中Map的key对应参数的名字;Map的value对应参数的值。
Map<String,String[]> map = request.getParameterMap();
Set<String> keys = map.keySet();
for(String key : keys){
String[] value = map.get(key);
System.out.println(key + " = " + value[0]);
}

GET请求和POST请求的区别

GET请求:
       Ø 请求参数会在浏览器的地址栏中显示,所以不安全;
       Ø 请求参数长度限制长度在1K之内;
       Ø GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
POST请求:
      Ø 请求参数不会显示浏览器的地址栏,相对安全;
      Ø 请求参数长度没有限制

最为常见的客户端传递参数方式有两种(get/post)

l 浏览器地址栏直接输入:一定是GET请求;
l 超链接:一定是GET请求;
l 表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

请求转发和重定向
1:请求转换是服务器内部跳转,所有地址栏上的路径不会改变; 重定向是浏览器在次发送请求,地址栏上的路径会发生改变。
2:请求转发只发送一次请求; 重定向会发送两次请求。
3:请求转发只能在当前应用内部跳转; 重定向可以在内部跳转也可以跳出当前应用。
4:请求转发时,因为是内部跳转; 它的路径写法是 /资源路径。重定向它的路径需要写 /工程名/资源路径。
5:请求转发,可以共享reqeust ; 重定向不可能,因为每一次都是一个新的request。
6:请求转换是通过reqeust发起  request.getRequestDispatcher().forward(); 重定向  response发起 response.sendRedirect()。

请求转发

request.getRequestDispatcher("/success.html").forward(request,response);

HttpServletResponse

1.设置响应头

可以使用response对象的setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器!
void setHeader(String name, String value)      设定指定名称和值设置响应头的名称和内容
void setIntHeader(String name, int value)     设定 int 类型的值到 name 标头
void setDateHeader(String name, long date)     使用指定名称和值设置响应头的名称和内容
void addDateHeader(String name, long date)     添加指定名称的响应头和日期值
void addHeader(String name, String value)     添加指定名称的响应头和值
void addIntHeader(String name, int value)     添加指定名称的响应头和int值
boolean containsHeader(String name)             返回指定的响应头是否存在
httpServletResponse.setHeader("content-type","text/html;charset=utf-8")
httpServletResponse.setHeader("Refresh","5;URL=http://www.baidu.com") 5秒后自动跳转到百度

2.设置状态码

(1)httpServletResponse.setContentType("text/html;charset=utf-8")   等同与调用response.setHeader(“content-type”, “text/html;charset=utf-8”);
(2)httpServletResponse.setCharacterEncoding("utf-8"):             设置字符响应流的字符编码为utf-8;
(3)httpServletResponse.setStatus(200):                             设置状态码;
(4)httpServletResponse.sendError(404, "资源不存在")                当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。

3.设置响应正文

response向客户端响应有两种响应流:字符响应流,字节响应流
(1)PrintWriter out = response.getWriter():获取字符流;
(2)ServletOutputStream out = response.getOutputStream():获取字节流;
在一个请求中不能同时使用这两个流。不然会抛出IllegalStateException异常。
字符编码:
httpServletResponse.getWriter()时默认字符编码为ISO-8859-1,可用httpServletResponse.setCharaceterEncoding("utf-8")来设置。
httpServletResponse.setContentType("text/html;charset=utf-8")    设置头、正文。
httpServletResponse.setCharaceterEncoding("utf-8")               设置正文。

public void test(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)throws Exception{
    String outputStreamData = "日拱一卒无永尽,功不唐捐总入海。";
    ServletOutputStream  servletOutputStream = httpServletResponse.getOutputStream();// 获取输出流
    // 通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
    httpServletResponse.setHeader("content-type", "text/html;charset=UTF-8");
    // 将字符转换成字节数组,指定以UTF-8编码进行转换
    byte[] dataByteArr = outputStreamData.getBytes("UTF-8");
    //使用OutputStream流向客户端输出字节数组
    servletOutputStream.write(dataByteArr);
    servletOutputStream.flush();
    servletOutputStream.close();

    String printWriterData = "日拱一卒无永尽,功不唐捐总入海。";
    httpServletResponse.setContentType("text/html;charset=utf-8");
    PrintWriter printWriter = httpServletResponse.getWriter(); // 获取输出流
    // 将字符转换成字节数组,指定以UTF-8编码进行转换
    httpServletResponse.setHeader("Content-type",  "text/html;charset=UTF-8");
    printWriter.write(printWriterData);// 使用PrintWriter流向客户端输出字符
    printWriter.flush();
    printWriter.close();
}

4.重定向

(1).设置响应码为302,设置请求地址url: 
httpServletResponse.setStatus(302);
httpServletResponse.setHeader("Location", "http://www.baidu.com");
(2)
httpServletResponse.sendRedirect("http://www.baidu.com");

下载文件

以流的形式下载文件。
public HttpServletResponse download111(String path, HttpServletResponse response) {
	try {
		// path是指欲下载的文件的路径。
		File file = new File(path);
		// 取得文件名。
		String filename = file.getName();
		// 取得文件的后缀名。
		String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
		// 以流的形式下载文件。
		InputStream inputStream = new BufferedInputStream(new FileInputStream(path));
		byte[] buffer = new byte[inputStream.available()];
		inputStream.read(buffer);
		inputStream.close();
		// 清空response
		response.reset();
		// 设置response的Header
		response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
		response.addHeader("Content-Length", "" + file.length());
		OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); // ServletOutputStream  ServletOutputStream
		response.setContentType("application/octet-stream");
		outputStream.write(buffer);
		outputStream.flush();
		outputStream.close();
	} catch (IOException ex) {
		ex.printStackTrace();
	}
	return response;
}

下载本地文件
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
	String fileName = "demo.doc".toString(); // 文件的默认保存名
	// 读到流中
	InputStream inputStream = new FileInputStream("D:/demo.doc");// 文件的存放路径
	// 设置输出的格式
	response.reset();
	response.setContentType("bin");
	response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
	// 循环取出流中的数据
	byte[] bytes = new byte[100];
	int len;
	try {
		while ((len = inputStream.read(bytes)) > 0)
			response.getOutputStream().write(bytes, 0, len);
		inputStream.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}


下载网络文件
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
	int bytesum = 0;
	int byteread = 0;
	URL url = new URL("windine.blogdriver.com/logo.gif");
	try {
		URLConnection conn = url.openConnection();
		InputStream inStream = conn.getInputStream();
		FileOutputStream fs = new FileOutputStream("c:/abc.gif");
		byte[] buffer = new byte[1204];
		int length;
		while ((byteread = inStream.read(buffer)) != -1) {
			bytesum += byteread;
			System.out.println(bytesum);
			fs.write(buffer, 0, byteread);
		}
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

Excel操作(poi)

 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>4.0.1</version>
	</dependency>

POI方法 -- Excel文件读操作

public static void readExcel()throws Exception{
	String pathName="D:/XLS文件.xls";
	File file = new File(pathName);
	FileInputStream fileInputStream = new FileInputStream(file.getAbsolutePath());
	// .xls文件
	HSSFWorkbook hssfWorkbook = null;
	// .xlsx文件
	XSSFWorkbook xssfWorkbook = null;
	//表格(第一个 index=0)
	Sheet sheet = null;
	if(pathName.indexOf(".xlsx") >= 0){
		System.out.print("读取xlsx文件");
		xssfWorkbook = new XSSFWorkbook(fileInputStream);
		sheet = xssfWorkbook.getSheetAt(0);
	}else{
		System.out.print("读取xls文件");
		hssfWorkbook = new HSSFWorkbook(fileInputStream);
		sheet = hssfWorkbook.getSheetAt(0);
	}
	int firstRowNum = sheet.getFirstRowNum();
	int lastRowNum = sheet.getLastRowNum();
	//逐行遍历
	for (int i = firstRowNum; i <= lastRowNum; i++) {
		Row row = sheet.getRow(i);
		if (row != null) {
			//判断Cell不为空
			for(Cell cell:row){
				if (cell!=null||!"".equals(cell)||cell.getCellType()!= CellType.BLANK||cell.getCellType() != CellType.ERROR) {
					CellType cellType=cell.getCellType();
					if(CellType.NUMERIC==cellType){
						//判断日期类型
						if(HSSFDateUtil.isCellDateFormatted(cell)) {  //是
							Date cellDate = cell.getDateCellValue();
						  //  String cellValue = DateUtil.isCellDateFormatted(cell.getDateCellValue(),"yyyy-MM-dd");
						}else {  //否
							String  cellValue = new DecimalFormat("#.######").format(cell.getNumericCellValue());
							double number = cell.getNumericCellValue();
							System.out.println("第" + i + "行信息为:" + number + " | ");
						}
					}else if(CellType.STRING==cellType){
						String str = cell.getStringCellValue();
						System.out.println("第" + i + "行信息为:" + str + " | ");
					}else if(CellType.FORMULA==cellType){
						String str = cell.getCellFormula();
						System.out.println("第" + i + "行信息为:" + str + " | ");
					}else if(CellType.BLANK==cellType){
						System.out.println(" 此格为空 ");
					}else if(CellType.BOOLEAN==cellType){
						boolean flag = cell.getBooleanCellValue();
						System.out.println("第" + i + "行信息为:" + flag + " | ");
					}else {
						System.out.print("错误类型");
					}
				}
			}

		}
	}
	hssfWorkbook.close();
	fileInputStream.close();
}

//Excel上传
public void test001(HttpServletRequest httpServletRequest)throws Exception{
        MultipartHttpServletRequest multiPartRequest = (MultipartHttpServletRequest)httpServletRequest;
        MultipartFile multipartFile =multiPartRequest.getFile("file");
        InputStream inputStream = multipartFile.getInputStream();
        Workbook workbook = WorkbookFactory.create(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        
}

POI方法 -- Excel文件写操作

public static void writeExcel()throws Exception {
		Workbook workbook;
		String excelStyle = "XLSX";
		String sheetName = "测试数据";
		String pathName = "D:/XLSX文件.xlsx";
		if (".XLS".equals(excelStyle.toUpperCase())) {
			workbook = new HSSFWorkbook();// .xls文件
		} else {
			workbook = new XSSFWorkbook();// .xlsx文件
		}
		// 生成一个表格,从0行开始。
		Sheet sheet = workbook.createSheet(sheetName);
		Row row = sheet.createRow(0);
		String[] titles = {"姓名", "密码", "住址", "电话"};
		//创建表头信息
		for (int i = 0; i < titles.length; i++) {
			Cell cell = row.createCell(i);
			cell.setCellValue(titles[i]);
		}
	   //编辑表格信息
		for (int i = 1; i < 10; i++) {//行
			row = sheet.createRow(i);
			for (int j = 0; j <titles.length; j++) {//列
				Cell cell = row.createCell(j);
				cell.setCellValue("要填入的信息");
			}
		}
		//写入到文件中
		File file = new File(pathName);
		OutputStream outputStream = new FileOutputStream(file);
		workbook.write(outputStream);
		workbook.close();
		outputStream.close();
}

SpringBoot异步

必须用在public方法上(ServiceImpl里)
在某异步方法的同一个类的其他方法调用此异步方法无效

简单用法

激活Spring的异步: @EnableAsync 检测@Async注解。

1。启动类加@EnableAsync注解
@EnableAsync
@SpringBootApplication
public class Application {
    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }
}

2.方法上加 @Async注解
@Component
public class AsyncTask {
    //不带返回值
    @Async
    public void testDemoExecutor01(){
        System.out.println("testDemoExecutor01 thread name - " + Thread.currentThread().getName());
    }

    //带返回值
    @Async
    public Future testDemoExecutor02() {
        System.out.println("testDemoExecutor02 thread name - " + Thread.currentThread().getName());
            User user = new User();
            user.setName("Jun");
            user.setAge("17");
            Thread.sleep(7000);
            return new AsyncResult(user);
    }
}

3.测试
@Test
public void testDemo() throws ExecutionException, InterruptedException {

    @Autowired
    private AsyncTask asyncTask;
	
	System.out.println("testDemo Thread in test class " + Thread.currentThread().getName());
	Future futureUser = asyncTask.ctestDemoExecutor02();
	futureUser.get();
}

配置类用法(无需在启动类上加@EnableAsync注解)

1.创建配置类
@Configuration
@EnableAsync
public class SpringAsyncConfig {
    @Bean(name = "asyncUploadExcelExecutor")
    public Executor asyncUploadExcelExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor =  new ThreadPoolTaskExecutor();
        // 设置核心线程数
        threadPoolTaskExecutor.setCorePoolSize(5);
        // 设置最大线程数
        threadPoolTaskExecutor.setMaxPoolSize(10);
        // 设置队列大小
        threadPoolTaskExecutor.setQueueCapacity(99999);
        // 设置线程池中线程名前缀
        threadPoolTaskExecutor.setThreadNamePrefix("async-upload-excel-");
        //当达到 MaxPoolSize 不再调用新线程,用调用者所在线程之星异步任务。
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return threadPoolTaskExecutor;
    }
    @Bean(name = "asyncDownExcelExecutor")
    public Executor asyncDownExcelExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor =  new ThreadPoolTaskExecutor();
        // 设置核心线程数
        threadPoolTaskExecutor.setCorePoolSize(5);
        // 设置最大线程数
        threadPoolTaskExecutor.setMaxPoolSize(15);
        // 设置队列大小
        threadPoolTaskExecutor.setQueueCapacity(99999);
        // 设置线程池中线程名前缀
        threadPoolTaskExecutor.setThreadNamePrefix("async-down-excel-");
        //当达到 MaxPoolSize 不再调用新线程,用调用者所在线程之星异步任务。
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return threadPoolTaskExecutor;
    }
}

2.使用(一般在ServiceImpl的某些方法上)
public class demoServiceImpl{
	@Async("asyncUploadExcelExecutor")
	public void testAsyncExecutor04() {
		System.out.println("Execute uploadExcelExecutor executor - " + Thread.currentThread().getName());
	}
	
	@Async("asyncDownExcelExecutor")
	public void testAsyncExecutor05() {
		System.out.println("Execute downExcelExecutor executor - " + Thread.currentThread().getName());
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个框架整合可以分为以下几个步骤: 1. 集成 Spring Boot:在 pom.xml 文件中添加 Spring Boot 依赖,创建 Spring Boot 启动类。 2. 集成 MyBatis Plus:在 pom.xml 文件中添加 MyBatis Plus 依赖,配置数据源和 MyBatis Plus 相关配置。 3. 集成 Shiro:在 pom.xml 文件中添加 Shiro 依赖,创建 Shiro 配置类,配置 Shiro 的 Realm 和 SecurityManager。 4. 集成 JWT:在 pom.xml 文件中添加 jjwt 依赖,创建 JWT 工具类,用于生成和解析 JWT。 下面是一个简单的示例代码,你可以根据你的实际需求进行调整: 1. pom.xml 文件中添加依赖: ```xml <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version> </dependency> <!-- jjwt --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> ``` 2. 创建 Spring Boot 启动类: ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 3. 配置 MyBatis Plus: ```java @Configuration @MapperScan("com.example.mapper") public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` 4. 配置 Shiro: ```java @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); shiroFilter.setSecurityManager(securityManager); shiroFilter.setUnauthorizedUrl("/401"); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/401", "anon"); filterChainDefinitionMap.put("/**", "jwt"); shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap); Map<String, Filter> filters = new LinkedHashMap<>(); filters.put("jwt", new JwtFilter()); shiroFilter.setFilters(filters); return shiroFilter; } @Bean public DefaultWebSecurityManager securityManager(Realm realm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); return securityManager; } @Bean public Realm realm() { return new UserRealm(); } } ``` 5. 创建 JWT 工具类: ```java public class JwtUtil { private static final String SECRET_KEY = "your_secret_key"; private static final long EXPIRATION_TIME = 3600_000; // 1 hour public static String generateToken(String username) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } public static String getUsernameFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (JwtException e) { return false; } } } ``` 6. 创建 JwtFilter: ```java public class JwtFilter extends AuthenticatingFilter { @Override protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) { HttpServletRequest request = (HttpServletRequest) servletRequest; String token = request.getHeader("Authorization"); if (StringUtils.isBlank(token)) { return null; } return new JwtToken(token); } @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.getWriter().write("{\"code\":401,\"message\":\"未登录或登录已过期,请重新登录\"}"); return false; } @Override protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { HttpServletRequest request = (HttpServletRequest) servletRequest; String token = request.getHeader("Authorization"); if (StringUtils.isBlank(token)) { return false; } return JwtUtil.validateToken(token); } } ``` 7. 创建 JwtToken: ```java public class JwtToken implements AuthenticationToken { private final String token; public JwtToken(String token) { this.token = token; } @Override public Object getPrincipal() { return JwtUtil.getUsernameFromToken(token); } @Override public Object getCredentials() { return token; } } ``` 8. 创建 UserRealm: ```java public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { String username = (String) authenticationToken.getPrincipal(); User user = userService.getByUsername(username); if (user == null) { throw new UnknownAccountException("账号不存在"); } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } } ``` 这样,简单的 Spring Boot + Shiro + JWT + MyBatis Plus 整合就完成了。你可以根据具体的需求,对代码进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值