热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javassmsession_基于session的认证授权方式SSM

基于session的认证授权方式-SSM具体流程:当用户登陆成功后,会在服务端将用户的相关信息保存到session中,而将发给客户端的se

基于session的认证授权方式-SSM

具体流程:当用户登陆成功后,会在服务端将用户的相关信息保存到session中,而将发给客户端的session_id保存到COOKIE中,这样下次请求时带上session_id来校验服务端是否存在session数据,如果存在就校验通过,如果不存在就校验失败。当用户退出登录或session数据过期,就需要重新登录。

本案例工程使用maven进行构建,使用SpringMVC、Servlet3.0实现。

导入spring-webmvc,javax.servlet-api依赖

war

UTF-8

1.8

1.8

org.springframework

spring-webmvc

5.1.5.RELEASE

javax.servlet

javax.servlet-api

3.0.1

provided

org.apache.tomcat.maven

tomcat7-maven-plugin

2.2

localhost

8080

/

UTF-8

定义spring容器配置类

//spring容器配置 相当于applicationContext.xml

@Configuration

//组件扫描springmvc包 排除controller包

@ComponentScan(basePackages = "com.gyf.security.springmvc"

,excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)})

public class ApplicationConfig {

//将配置文件中的配置拿到类中来配置

//配置除了Controller的其他bean,如数据库连接池,事务管理器,业务bean等

}

定义springmvc配置类

//servletContext配置 /相当于springvc.xml文件

//该类实现WebMvcConfigurer接口进行配置

//组件扫描springmvc包,包含Controller包

@Configuration

@EnableWebMvc

@ComponentScan(basePackages = "com.gyf.security.springmvc"

,includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class))

public class WebConfig implements WebMvcConfigurer {

//视图解析器

@Bean

public InternalResourceViewResolver viewResolver(){

InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();

internalResourceViewResolver.setPrefix("/WEB-INF/view/");

internalResourceViewResolver.setSuffix(".jsp");

return internalResourceViewResolver;

}

//添加视图控制器

@Override

public void addViewControllers(ViewControllerRegistry registry) {

registry.addViewController("/").setViewName("login");

}

@Autowired

private SimpleAuthenticationInterceptor simpleAuthenticationInterceptor;

//添加拦截器

@Override

public void addInterceptors(InterceptorRegistry registry) {

//对指定的url进行拦截

registry.addInterceptor(simpleAuthenticationInterceptor).addPathPatterns("/r/**");

}

}

手动加载spring配置文件

//手动加载spring配置类

//该类继承AbstractAnnotationConfigDispatcherServletInitializer,此类实现WebApplicationInitializer接口,Spring容器启动时加载WebApplicationInitializer接口的所有实现类

public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

//加载spring容器 加载ApplicationContext.xml

@Override

protected Class>[] getRootConfigClasses() {

return new Class[]{ApplicationConfig.class};

}

//servletContext 加载springmvc.xml

@Override

protected Class>[] getServletConfigClasses() {

return new Class[]{WebConfig.class};

}

//url-mapping

@Override

protected String[] getServletMappings() {

return new String[]{"/"};

}

}

自定义认证页面 lgoin.jsp

用户登录

用户名:

密   码:

创建两个实体类 UserDto,AuthenticationRequest并添加get、set方法,构造方法

//用户表

public class AuthenticationRequest {

//用户名

private String username;

//密码

private String password;

}

//用户具体信息表

public class UserDto {

public static final String SESSION_USER_KEY ="_user";

//用户身份信息

private String id;

private String username;

private String password;

private String fullname;

private String mobile;

/**

* 用户的权限

*/

private Set authorities;

}

业务层Service 自定义认证服务用于用户的身份认证

public interface AuthenticationService {

//用户认证

UserDto authentication(AuthenticationRequest request);

}

@Service

public class AuthenticationServiceImpl implements AuthenticationService {

/**

* 用户认证

* @param request

* @return

*/

@Override

public UserDto authentication(AuthenticationRequest request) {

//校验参数是否为空

if (request==null || StringUtils.isEmpty(request.getUsername()) || StringUtils.isEmpty(request.getPassword())){

throw new RuntimeException("账号或密码为空");

}

//根据用户和密码去查询数据库 模拟数据库

UserDto userDto = this.getUserDto(request.getUsername());

//判断用户是否为空

if (userDto==null){

throw new RuntimeException("查询不到该用户");

}

//校验密码

if (!request.getPassword().equals(userDto.getPassword())){

throw new RuntimeException("密码错误");

}

//认证通过 返回用户的身份信息

return userDto;

}

//用户信息 假装到数据库获取数据

private Map map &#61; new HashMap<>();

//代码块

{

Set authorities1 &#61; new HashSet<>();

authorities1.add("p1");

Set authorities2 &#61; new HashSet<>();

authorities2.add("p2");

map.put("zhangsan",new UserDto("1010","zhangsan","123456","张三","123456",authorities1));

map.put("lisi",new UserDto("1001","lisi","123","李四","789456",authorities2));

}

//根据账号查询用户信息

private UserDto getUserDto(String username){

UserDto userDto &#61; map.get(username);

return userDto;

}

}

表现层Controller 仅测试用

//&#64;Controller&#43;&#64;ResponseBody

&#64;RestController

public class LoginController {

&#64;Autowired

private AuthenticationService authenticationService;

//produces 存文本类型

&#64;RequestMapping(value &#61; "/login",produces &#61; "text/plain;charset&#61;utf-8")

public String login(AuthenticationRequest request, HttpSession httpSession){

UserDto userDto &#61; authenticationService.authentication(request);

//将用户信息存入session

httpSession.setAttribute(UserDto.SESSION_USER_KEY,userDto);

return userDto.getUsername()&#43;"登陆成功";

}

/**

* 删除session中的数据

* &#64;param session

* &#64;return

*/

&#64;GetMapping(value &#61; "/logout",produces &#61; "text/plain;charset&#61;utf-8")

public String logout(HttpSession session){

//删除session中的数据

session.invalidate();

return "退出成功";

}

/**

* 判断session中是否有数据

* &#64;param session

* &#64;return

*/

&#64;GetMapping(value &#61; "/r/r1",produces &#61; "text/plain;charset&#61;utf-8")

public String r1(HttpSession session){

String fullname &#61; null;

//到session中获取数据

Object attribute &#61; session.getAttribute(UserDto.SESSION_USER_KEY);

if (attribute&#61;&#61;null){

fullname&#61;"匿名";

}else {

fullname&#61;((UserDto)attribute).getFullname();

}

return fullname&#43;"访问r1";

}

&#64;GetMapping(value &#61; "/r/r2",produces &#61; "text/plain;charset&#61;utf-8")

public String r2(HttpSession session){

String fullname &#61; null;

//到session中获取数据

Object attribute &#61; session.getAttribute(UserDto.SESSION_USER_KEY);

if (attribute&#61;&#61;null){

fullname&#61;"匿名";

}else {

fullname&#61;((UserDto)attribute).getFullname();

}

return fullname&#43;"访问r2";

}

}

自定义拦截器 用于用户的授权

//spring中的组件

&#64;Component

//实现 HandlerInterceptor接口

public class SimpleAuthenticationInterceptor implements HandlerInterceptor {

//校验用户请求的url是否在用户的权限范围内

//preHandle方法是在调用方法之前来调用这个方法

&#64;Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

/**

* 校验用户请求的url是否有权限访问

*/

//获取session中的用户信息

Object attribute &#61; request.getSession().getAttribute(UserDto.SESSION_USER_KEY);

//校验是否登录

if (attribute&#61;&#61;null){//代表session没有信息 提示登录

writContext(response,"请登录");

return false;

}

UserDto userDto &#61; (UserDto) attribute;

//获取请求url

String requestURI &#61; request.getRequestURI();

if (userDto.getAuthorities().contains("p1")&&requestURI.contains("r/r1")){

return true;

}

if (userDto.getAuthorities().contains("p2")&&requestURI.contains("r/r2")){

return true;

}

writContext(response,"没有权限访问");

return false;

}

//响应信息给前端

private void writContext(HttpServletResponse response, String msg) throws IOException {

//谁知响应格式

response.setContentType("text/application;charset&#61;utf-8");

PrintWriter writer &#61; response.getWriter();

//向前端返回数据

writer.print(msg);

writer.close();

}

}



推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 标题: ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 基于Axis、XFire、CXF的webservice客户端调用示例
    本文介绍了如何使用Axis、XFire、CXF等工具来实现webservice客户端的调用,以及提供了使用Java代码进行调用的示例。示例代码中设置了服务接口类、地址,并调用了sayHello方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
author-avatar
用巛户khm8pcnjp9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有