springMVC用户登录实例(二)

SpringMVC使用拦截器(Interceptor)实现用户登录校验 在系统中,经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中。当然不仅仅这些,所以需要一种机制,拦截用户的请求,在请求的前后添加处理逻辑。 SpringMVC提供了Interceptor拦截器机制,用于请求的预处理和后处理。在SpringMVC中定义一个拦截器有两种方法:第一种是实现HandlerInterceptor接口,或者继承实现了Handler... 阅读详情


1.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>02_spring_mvc_user</display-name>
  
   <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!-- springMVC 1.创建servlet -->
  <servlet>
  	<!-- 需要在WEB-INF下面创建对应的hello-servlet.xml -->
  	<servlet-name>user</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>user</servlet-name>
  	<!-- 捕获所有请求,基于rest -->
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
  
  
  <!-- 
  		OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面
  		布局和装饰(layout and decoration)的框架组件,
  		能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离
   -->
  <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2.user-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- springMVC 2.创建对应的servlet -->
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        
        
    <!-- 开启SpringMVC -->
        <mvc:annotation-driven/>
        <context:component-scan base-package="cn.edu.zttc.controller"></context:component-scan>
        
        <mvc:resources location="/resources/" mapping="/resources/**"/>
        
	<!-- 配置视图的前缀和后缀 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        	<!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> -->
        	<property name="prefix" value="/WEB-INF/jsp/"></property>
        	<property name="suffix" value=".jsp"></property>
        </bean>
        
	    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	    	<property name="maxUploadSize" value="5000000"></property>
	    </bean>
</beans>

3.decorators.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 
	装饰者,将所有页面都潜入basic的页面之中,使用
	<decorator:body />标签
	被嵌入的页面不用填写html的头标签等,只需要写body信息
 -->
<decorators defaultdir="/WEB-INF/temp/">
    <!-- Any urls that are excluded will never be decorated by Sitemesh -->
    <excludes>
        <pattern>/json*</pattern>
    </excludes>
    <decorator name="main" page="basic.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators>

4.basic.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>
User Manager
</h1>
<hr/>
<decorator:body />
</body>
</html>

5.error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error</title>
</head>
<body>
${ex.message }
</body>
</html>

6.login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post">
	username<input type="text" name="username"/><br/>
	password<input type="password" name="password"/><br/>
	<input type="submit"/>
</form>
</body>
</html>

7.add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<sf:form method="post" modelAttribute="user" enctype="multipart/form-data">
	username<sf:input path="username"/><sf:errors path="username"/><br/>
	password<sf:input path="password"/><sf:errors path="password"/><br/>
	nickname<sf:input path="nickname"/><br/>
	email<sf:input path="email"/><sf:errors path="email"/><br/>
	file<input type="file" name="files"/><br/>
	file<input type="file" name="files"/><br/>
	<input type="submit"/>
</sf:form>
</body>
</html>

8.list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/resources/css/main.css">
<title>Insert title here</title>
</head>
<body>
${loginUser.nickname}----${redir}<br/>
<a href="add">添加用户</a>
<a href="login">用户登录</a><br/>
<!-- 获取的是map,所以需要先.value -->
<c:forEach items="${users }" var="user">
	<a href="${user.value.username}">查看用户</a><a href="${user.value.username}/update">更新</a><a href="${user.value.username}/delete">删除</a>${user.value.username }=====${user.value.nickname }<br/>
</c:forEach>
</body>
</html>

9.show.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${user.username }=====${user.nickname }=====${user.email }<br/>
</body>
</html>

10.update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<sf:form method="post" modelAttribute="user">
	username<sf:input path="username"/><sf:errors path="username"/><br/>
	password<sf:input path="password"/><sf:errors path="password"/><br/>
	nickname<sf:input path="nickname"/><br/>
	email<sf:input path="email"/><sf:errors path="email"/><br/>
	<input type="submit"/>
</sf:form>
</body>
</html>

11.UserController

package cn.edu.zttc.controller;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import cn.edu.zttc.vo.User;
import cn.edu.zttc.vo.UserException;
/**
 * springMVC加入了JSR303(Bean Validate的功能)
 * @author admin
 */
@Controller
@RequestMapping("/user")
@SessionAttributes(value="loginUser")
public class UserController {
	private final static Map<String, User> users = new HashMap<String, User>();
	public UserController(){
		users.put("ldh", new User("ldh", "123", "ldh@163.com", "华仔"));
		users.put("zxy", new User("zxy", "123", "ldh@163.com", "学友"));
		users.put("gfc", new User("gfc", "123", "ldh@163.com", "郭富城"));
		users.put("lm", new User("lm", "123", "ldh@163.com", "黎明"));
	}
	/**
	 * 获取用户列表
	 * @param model
	 * @return
	 */
	@RequestMapping({"/users","/"})
	public String list(Model model){
		model.addAttribute("users",users);
		return "user/list";
	}
	/**
	 * 跳转到添加页面
	 * @param model
	 * @return
	 */
	@RequestMapping(value="/add",method=RequestMethod.GET)
	public String add(Model model){
		model.addAttribute(new User());
		return "user/add";
	}

	/**
	 * 
	 * 添加页面提交请求,post方式
	 * @param user
	 * @param file 上传文件方式
	 * @param binding 接收错误信息的(必须要在要进行验证的对象之后)
	 * @return
	 */
	//参数user与页面的form表单中的modelAttribute的值一样
	@RequestMapping(value="/add",method=RequestMethod.POST)
	public String add(@Valid User user,BindingResult binding,@RequestParam MultipartFile[] files,HttpServletRequest req){
		if (binding.hasErrors()) {
			return "user/add";
		}
//		System.out.println(file.getContentType()+","+file.getName()+","+file.getOriginalFilename());
		String realPath = req.getSession().getServletContext().getRealPath("/resources/upload");
		for(MultipartFile file:files){
			try {
				System.out.println(realPath);
				FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath+"/"+file.getOriginalFilename()));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		users.put(user.getUsername(), user);
		//执行客户端跳转
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
	
	/**
	 * 显示用户信息
	 * @param username
	 * @param model
	 * @return
	 */
	@RequestMapping(value="/{username}",method=RequestMethod.GET)
	public String show(@PathVariable String username,Model model){
		model.addAttribute(users.get(username));
		return "user/show";
	}
	
	/**
	 * 跳转到更新页面
	 * @param username
	 * @param model
	 * @return
	 */
	@RequestMapping(value="/{username}/update",method=RequestMethod.GET)
	public String update(@PathVariable String username,Model model){
		model.addAttribute(users.get(username));
		return "user/update";
	}
	/**
	 * 更新页面提交请求
	 * @param username
	 * @param user
	 * @param br 接收错误信息的
	 * @return
	 */
	//参数user与页面的form表单中的modelAttribute的值一样
	@RequestMapping(value="/{username}/update",method=RequestMethod.POST)
	public String update(@PathVariable String username,@Valid User user,BindingResult br){
		if (br.hasErrors()) {
			return "user/update";
		}
		users.put(username, user);
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
	
	/**
	 * 删除操作
	 * @param username
	 * @return
	 */
	@RequestMapping(value="/{username}/delete",method=RequestMethod.GET)
	public String delete(@PathVariable String username){
		users.remove(username);
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}

	/**
	 * 跳转到登录页面
	 * @return
	 */
	@RequestMapping(value="/login",method=RequestMethod.GET)
	public String login(){
		return "user/login";
	}
	/**
	 * 登录提交页面
	 * @param username
	 * @param password
	 * @return
	 */
	@RequestMapping(value="/login",method=RequestMethod.POST)
	public String login(String username,String password,Model model){
		if (!users.containsKey(username)) {
			throw new UserException("用户名不存在");
		}
		if (!password.equals(users.get(username).getPassword())) {
			throw new UserException("用户名密码不正确");
		}
		model.addAttribute("loginUser",users.get(username));
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
	
	/**
	 * 捕获异常执行的方法
	 * @return
	 */
	@ExceptionHandler(UserException.class)
	public String handlerException(Exception ex,HttpServletRequest req){
		req.setAttribute("ex", ex);
		return "error";
	}
	
	/**
	 * redirect方式传request范围的对象
	 * @param model
	 * @param ra
	 * @return
	 */
	@RequestMapping(value="/redir")
	public String redir(Model model,RedirectAttributes ra){
		ra.addFlashAttribute("redir","我的redirect方式传request范围的对象");
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
}

12.User

package cn.edu.zttc.vo;

import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;


public class User {
	private String username;
	private String password;
	private String email;
	private String nickname;
	
	public User() {
		super();
	}
	public User(String username, String password, String email, String nickname) {
		super();
		this.username = username;
		this.password = password;
		this.email = email;
		this.nickname = nickname;
	}
	
	@NotEmpty(message="用户名不能为空")
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}

	@NotEmpty(message="密码不能为空")
	@Size(min=1,max=20,message="密码长度应在1-20之间")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	@Pattern(regexp="^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$",message="邮箱格式不正确")
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
}

13.UserException

package cn.edu.zttc.vo;

public class UserException extends RuntimeException {
	private static final long serialVersionUID = 1L;

	public UserException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public UserException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public UserException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

}

项目结构图:


引入的包:


SpringMVC + Mybatis 实现用户登录功能 因业务需要,刚刚接触Web编程。之前仅有移动端经验,一个简单的登录功能,都花费了不少功夫,当然部分原因是想尽量遵循框架的规范。 实现过程参考了 Spring学习之SpringMVC框架快速搭建实现用户登录功能 mybatis实战教程(mybatis in action),mybatis入门到精通 感谢两位的分享。 1.首先配置web.xml,以.do结尾的请求,将通过Disp 阅读详情

相关推荐

spring mvc 登陆验证

最简单的Spring MVC 架构的登陆验证系统。

使用springmvc框架完成登录

GoodsController类。UserController类。index.jsp页面。login.jsp页面。zhuye.jsp页面。error.jsp页面。

wangzhigang0926的博客 755

springmvc框架的用户登录注册的简单实现

spring初学这可以参考的用户登录注册简单的例子,mvc设计模式的spring框架,适合初学者,比较简单,容易理解和入门

SpringMvc简单使用——用户登录注册

SpringMvc简单使用——用户登录注册

qq_54000767的博客 5092

springMVC实现用户注册及登陆

Java+tomcat+springMVC;实现用户注册及登陆 .没有Service与dao

SpringMVC实现简单登录配置

SpringMVC实现简单登录配置,其中各种具体的配置文件编写,实现了一个简单的使用springmvc的登录例子

SpringMVC登录

1.创建数据库chapter13,表t_user 2.创建项目并导入jar包 3.创建相关文件,结构如下 MyController01.java package com.sunhuimin.controller; import java.io.IOException; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import org.springframework.stereo

weixin_45911547的博客 588

原子力显微镜AFM图像处理软件Gwyddion使用教程(图文)

Gwyddion使用教程Gwyddion简介Gwyddion user guide下载地址本次教程用的AFM扫描图像下载地址AFM/STM校准样品Gwyddion使用step1step2step3step4step5step6step7step8你没见过的CD磁道到底长啥样一张图总结 Gwyddion简介        &nbs...

王纯配的博客 5万+

SpringMVC案例 - 简单登录

springmvc 的简单登陆

高冷的上官梓芸的博客 6850

AHP层次分析法在项目风险评估中的实战应用(含Excel模板)

本文详细介绍了AHP层次分析法在项目风险评估中的实战应用。通过构建风险层次模型、利用判断矩阵量化主观判断,并结合Excel工具进行权重计算与一致性检验,将模糊的定性风险转化为清晰的量化排序。文章以新产品上线项目为例,提供了完整的分析流程和可操作的Excel模板,帮助项目经理高效识别并优先处理核心风险。

weixin_29061465的博客 570

Python气象数据处理实战:用PyCINRAD轻松绘制雷达PPI图像(附避坑指南)

本文详细介绍了如何使用Python库PyCINRAD处理中国CINRAD系列天气雷达的基数据,并绘制专业的PPI图像。内容涵盖从环境配置、数据读取、核心绘图到高级定制与批量处理的完整流程,并针对安装依赖、中文乱码、数据范围等常见问题提供了实用的避坑指南,帮助气象工作者高效完成雷达数据可视化。

dog123的博客 222

SpringMVC学习之用户登录(二)

SpringMVC 参数传递与接受

何大江的博客 742

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5586

用户登录和授权(二)springmvc+security实现

全部代码地址: https://github.com/pshdhx/security-springmvc-pshdhx.git 首先,拦截用户的请求就不用web.xml或者是spring-mvc.xml来做了。直接上security的配置文件; /** * security配置 */ @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {..

pshdhx的博客 312

SAP ABAP 如何实现物料主数据接口的增量传输机制?

如何实现物料主数据接口的增量传输机制?我在各客户系统中看到了五花八门的实现方式,即使是 IBM 实施的开发质量也并没有保证。其实这是一个很简单的问题,下面以物料主数据接口为例子,介绍 SAP 中更改文档对象的接口数据增量传输机制。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1316

硬核反坑!YOLOv5训练避坑指南:根治梯度消失、不收敛、检测漏框三大核心问题(附实战代码+调优清单)

数据是基础,超参数是关键,模型是工具,训练策略是保障。梯度消失、不收敛、检测漏框这三大问题,本质上都是“数据-模型-训练”不匹配的结果。梯度消失/爆炸:优先调整学习率策略+梯度裁剪,其次优化模型结构;训练不收敛:优先清洗数据集,其次调优超参数,最后检查配置文件;检测漏框:优先重新聚类锚框,其次增强浅层特征,最后调整推理参数。YOLOv5训练的最高境界,不是调参,而是让数据、模型、训练策略三者完美匹配。按本文的方法反坑,你的YOLOv5训练一定能一次成功!🚀。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 233

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证...

序:   在上一篇中,咱们已经对于项目已经做了基本的配置,这一篇文章开始学习Shiro如何对登录进行验证。 教学: 一、Shiro配置的简要说明。   有心人可能注意到了,在上一章的applicationContext.xml配置文件中,包含以下配置。 <!-- 項目自定义的Realm --> <bean id="shiroDbReal...

diaojie7665的博客 164

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1146

JAVA面试题分享五百二十三:SpringBoot不用ThreadLocal实现登录用户上下文

我在实际的工作中,经常遇见ThreadLocal污染的局面(A用户登录了,上下文取到的却是B用户的信息),基本上都是没有及时销毁ThreadLocal所致。用户调用业务接口,Filter拦截,校验JWT,并将Redis存储的用户信息写入ThreadLocal,例如LoginUserContext等。虽然也很容易规避,但我一直想着能否不用ThreadLocal,毕竟我能力有限,才疏学浅,一看有“Thread”字样的,就犯怵。一般来说,用户登录成功,服务端下发JWT,并将用户信息写入Redis。

之乎者也·的博客 833

【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现

朴素贝叶斯(Naive Bayes)分类器可以用来确定输入文本属于某一组类别的概率。例如,预测评论是正面的还是负面的。它是 “朴素的”,它假设文本中的单词是独立的(但在现实的自然人类语言中,单词的顺序传达了上下文信息)。尽管有这些假设,但朴素贝叶斯在使用少量训练集预测类别时具有很高的准确性。

Data · Model · Agent · Repeat 2173

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mvc java 实现文件下载_SpringMVC实现文件下载功能

本文实例为大家分享了SpringMVC文件下载的具体代码,供大家参考,具体内容如下两个案例1.为登录用户提供下载服务。2.阻止仅通过输入网址即可获取下载。文件下载概览为了将文件发送给浏览器,我们需要在控制器中完成以下操作:对请求处理方法使用void返回类型,并且在方法中添加HttpServletResponse参数。将响应的内容类型设为文件的内容类型。Content-Type标题在某个实体的bod...

weixin_39557199的博客 231

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

自定义SpringMVC参数解析器(1128_二_下午)

resolveArgument方法是自定义参数解析器的核心,先获取请求对象request,通过CookieUtil工具类中的getCookie方法获取到token令牌,如果token不为空,则通过myReidsTemplate中的get方法把user获取到。WebConfig是一个配置类,它实现了WebMvcConfigurer接口,并且重写了addArgumentResolvers方法,在该方法中可以将将咱们自己定义参数解析器添加到SpringMVC框架的参数解析器列表中,从而使其生效。

weixin_64760330的博客 381

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

微服务获取用户信息和OpenFeign传递用户

请求,因此我们可以将用户信息以请求头的方式传递到下游微服务。考虑到微服务内部可能很多地方都需要用到登录用户信息,因此我们可以利用SpringMVC的拦截器来实现登录用户信息获取,并存入。下单的过程中,需要调用商品服务扣减库存,调用购物车服务清理用户购物车。前端发起的请求都会经过网关再到微服务,由于我们之前编写的过滤器和拦截器功能,微服务可以轻松获取登录用户信息。编写微服务拦截器,拦截请求获取用户信息,保存到ThreadLocal后放行。改造网关过滤器,在获取用户信息后保存到请求头,转发到下游微服务。

sdg_advance的博客 1306

mvc php session,SpringMVC存取Session的两种方法

WEB 应用通常会引入 Session,用来在服务端和客户端之间保存一系列动作/消息的状态,比如网上购物维护 user 登录信息直到 user 退出。SpringMVC存取Session的两种方法,具体如下:方法一:使用servlet-api@Controllerpublic class ManagerController {@Resourceprivate ManagerService mana...

weixin_34576293的博客 172

Spring学习之SpringMVC框架快速搭建实现用户登录功能

关于SpringMVC的介绍我就不多说了,网上一搜一大堆,好多大鸟的博客都有详细的描述,之前看的跟开涛学SpringMVC,写的非常好,SpringMVC运行的流程和原理讲的非常的细致在此我引用一下开涛前辈的图片和文字,大家要是想看原文就点击上面的链接。 SpringMVC处理请求的流程图 大家一定要仔细的看,最好是拿张纸,画一画,可比你光看有效果,大家可以与纯MVC模式对

766
上一篇: springMVC简单的实现代码(一)
下一篇: maven的环境搭建与测试编写(一)
阳小良
博客等级 码龄17年 54粉丝 155原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值