当前位置: 首页 > news >正文

深圳建设网站公领导高度重视网站建设

深圳建设网站公,领导高度重视网站建设,闵行网站建设多久能见效果,wordpress+内网目录 前言 一、Java web设置session超时 二、session并发控制 三、退出/logout设置 前言 本文是继SSM项目集成Spring Security 4.X版本#xff08;使用spring-security.xml 配置文件方式#xff09;_spring security4.x 会话管理配置文件版-CSDN博客https://blog.csdn.ne…目录 前言 一、Java web设置session超时 二、session并发控制 三、退出/logout设置 前言 本文是继SSM项目集成Spring Security 4.X版本使用spring-security.xml 配置文件方式_spring security4.x 会话管理配置文件版-CSDN博客https://blog.csdn.net/u011529483/article/details/135699004?spm1001.2014.3001.5501文章之后的配置继续实现了 session超时单点登录-session并发控制退出/logout 三项配置。 在配置过程中遇到了一些问题。正因如此才使我想要写文章记录。 一、Java web设置session超时 java web应用设置session超时默认是 30 分钟也就是失效时间的方法有 按优先执行权从高到底是 1. 容器的配置中设置 如tomcat的web.xml中设置 session-config session-timeout 30 /session-timeout /session-config 2. java项目的web.xml中设置本文中采用了此种方式 !--设置session超时单位分钟--session-configsession-timeout2/session-timeout/session-config 3. 通过java代码设置 HttpSession session request.getSession();session.setMaxInactiveInterval(120); //单位秒 Spring Security 中给我们提供了security:session-management标签进行session的配置管理spring-security.xml 配置文件截图如下 先来看看 invalid-session-url/s_timeout.jsp 配置的运行效果手动设置session超时时间为 2 分钟项目的web.xml文件中设置 运行项目登录成功后等待2分钟后访问服务器。2分钟后session超时失效。 登录成功后访问了菜单查询 2 分钟后再次访问菜单查询跳转到了超时页面说明我们的 invalid-session-url/s_timeout.jsp  配置生效了。 二、session并发控制 什么是session并发控制就是同一个账号多处客户端同一时间段发起的请求也就生成了多个session会话。session并发控制就是控制这些session会话的数量。现在我们将session会话数量设置为 1 即同时段同账号只能有一个用户登录成功后面登录的挤掉前面登录的。spring-security.xml 配置如下 !-- session管理invalid-session-url指定使用已经超时的sessionId保存在Cookie中进行请求需要重定向的页面或路径。max-sessions默认值为1session并发数量控制。控制同一用户在系统中同时允许存在的已经通过认证的session数量。当超过这个值时Spring Security的默认策略是将先前的设为无效。如果要限制用户再次登录可以设置concurrency-control的error-if-maximum-exceeded的值为true。--security:session-management invalid-session-url/s_timeout.jspsecurity:concurrency-control max-sessions1 error-if-maximum-exceededfalse//security:session-management max-sessions1 设置session并发数量为 1。 error-if-maximum-exceededfalse 设置为false后面登录的挤掉前面登录的。设置为true表示前面登录的保留后面登录的被拒绝。 要使以上设置生效还需要在项目的web.xml文件中添加监听 !--加载SpringSecuritySession并发控制--listenerlistener-classorg.springframework.security.web.session.HttpSessionEventPublisher/listener-class/listener 网上很多都说了这两步配置但是我配置后不生效。 后面我在网上查了原因经过调试后实现了单点登录同一个账号只能有一处登录在线的效果。需要在 SysUser 实体类中或自定义用户详情类中重写equals和hashCode方法 package com.wqbr.wqdemotwo.domain;import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails;import java.util.*;/*** 系统用户封装用户数据实现 UserDetails 接口* author lv* date 2024年1月11日*/ public class SysUser implements UserDetails {private static final long serialVersionUID 1L;private String id;private String username; //从UserDetails的重写方法中返回private String password; //从UserDetails的重写方法中返回private Date addtime;private boolean accountnonexpired; //账户是否过期从UserDetails的重写方法中返回private boolean accountnonlocked; //账户是否锁定从UserDetails的重写方法中返回private boolean credentialsnonexpired; //密码是否过期从UserDetails的重写方法中返回private boolean enabled; //账户是否可用从UserDetails的重写方法中返回// 储存用户拥有的所有权限private ListGrantedAuthority authorities new ArrayList(); //从UserDetails的重写方法中返回public String getId() {return id;}public void setId(String id) {this.id id;}public void setUsername(String username) {this.username username;}public void setPassword(String password) {this.password password;}public Date getAddtime() {return addtime;}public void setAddtime(Date addtime) {this.addtime addtime;}// 返回用户权限上面声明了权限集合对象 authoritiesOverridepublic Collection? extends GrantedAuthority getAuthorities() {return this.authorities;}public void setAuthorities(ListGrantedAuthority authorities) {this.authorities authorities;}// 返回用户密码上面声明了属性 passwordOverridepublic String getPassword() {return password;}// 返回用户名上面声明了属性 usernameOverridepublic String getUsername() {return username;}Overridepublic boolean isAccountNonExpired() {return accountnonexpired;}public void setAccountnonexpired(boolean accountnonexpired) {this.accountnonexpired accountnonexpired;}Overridepublic boolean isAccountNonLocked() {return accountnonlocked;}public void setAccountnonlocked(boolean accountnonlocked) {this.accountnonlocked accountnonlocked;}Overridepublic boolean isCredentialsNonExpired() {return credentialsnonexpired;}public void setCredentialsnonexpired(boolean credentialsnonexpired) {this.credentialsnonexpired credentialsnonexpired;}Overridepublic boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled enabled;}/*重写equals和hashCode方法因为如果是自定义的UserDetails 则需要重定义equal和hashcode。另外Spring Security 中通过 SessionRegistryImpl 类来实现对会话信息的统一管理而 SessionRegistryImpl 类中定义了private final ConcurrentMapObject, SetString principals; 是一个Map集合其中的key是指定的对象。在 JavaSE 中用对象做 key需要重写 equals 方法和 hashCode 方法否则第一次存完数据下次就找不到了。*/Overridepublic boolean equals(Object obj) {if (obj instanceof SysUser) {return username.equals(((SysUser) obj).username);}return false;}Overridepublic int hashCode() {return username.hashCode();}} 为什么要重写这两个方法呢因为自己动手创建用户实体类实现自定义用户详情验证需要显式实现equals和hashCode方法。而我的用户实体类 SysUser 实现了 UserDetails接口。没有重写equals和hashCode方法所以 导致这样配置的效果没有实现。另外Spring Security 中通过 SessionRegistryImpl 类来实现对会话信息的统一管理而 SessionRegistryImpl 类中定义了 private final ConcurrentMapObject, SetString principals; 是一个Map集合其中的key是指定的对象。 在 JavaSE 中用对象做 key需要重写 equals 方法和 hashCode 方法。 现在来看看我们重写 equals 方法和 hashCode 方法后项目的运行效果项目启动完毕后先在谷歌浏览器登录登录成功后我访问了菜单请求如图 说明登录成功并顺利访问资源。且idea控制台打印的session信息 然后我们在另外一种浏览器360中再次登录 登录成功顺利请求到资源。且idea控制台打印的session信息 可以看到360浏览器和谷歌浏览器访问的IDEA控制台打印出的session ID 不同说明同一个用户发起了两次请求。此时再访问谷歌浏览器去请求一次资源得到如下结果 这段英文翻译如下 继续刷新请求一次就重定向到会话超时页面 此时360浏览器登录的用户是可以继续请求资源的。spring-security控制session并发数量实现单点登录就实现了。 三、退出/logout设置 spring-security.xml 文件中的配置 !--security:logout/注销功能logout-url/logout退出过滤器默认的拦截路径springSecurity内LogoutFilter要拦截的url(向这/logout发送请求来注销)logout-success-url用户退出后要被重定向的urlinvalidate-session默认为true,用户在退出后Http session失效success-handler-ref指定一个bean(需要实现LogoutSuccessHandler接口)用来自定义退出成功后的操作delete-cookiesJSESSIONID删除session对应的cookie--security:logout logout-url/logout logout-success-url/login invalidate-sessiontrue delete-cookiesJSESSIONID/ 配置后运行项目点击 退出 后 logout-success-url/login 重定向配置没有生效。查到原因不能 security:intercept-url pattern/login accesspermitAll()/ 这样配置/login路径的放行策略。需要放到spring security过滤链策略外配置如下 !--securitynone指定不受Spring Security管理-- security:http securitynone pattern/login / spring-security.xml 完整的配置代码 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:securityhttp://www.springframework.org/schema/securityxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd!--指定不受Spring Security管理--security:http securitynone pattern/login /!--spring过滤器链配置1) 需要拦截什么资源2) 什么资源对应什么角色权限3) 定制认证方式: HttpBasic or FormLogin4) 自定义登录页面,定义登录请求地址,定义错误处理方式--security:http!--使用form-login的方式进行认证login-page:指定获取登录页面的url(需要编写controller返回登录页面)login-processing-url:指定登录页面中post请求提交到哪里的url(不需要编写controller框架已实现)default-target-url:指定登录成功后跳转到哪个url(需要编写controller)authentication-success-handler-ref:指定登录成功后由哪个类来进行处理authentication-failure-handler-ref:指定登录失败后由哪个类来进行处理username-parameter指定登录表单中用户名的input中name值如果这里不配置则默认为usernamepassword-parameter指定登录表单中密码的input中name值如果这里不配置则默认为password--security:form-login login-page/login login-processing-url/spring_security_checkauthentication-success-handler-refmyAuthenticationSuccessHandlerauthentication-failure-handler-refmyAuthenticationFailureHandler/!-- 关闭csrf的保护--security:csrf disabledtrue/!-- 配置资源拦截规则pattern属性指定资源目录: 即需要拦截的资源 /* 代表根目录下的一级目录 /** 代表根目录下的所有目录access(SpEL)方法执行Spring EL表达式。提供如下表达式permitALL():设置那些路径可以直接访问不需要认证。直接返回trueisAnonymous():只有匿名用户可以访问登录用户不可访问isAuthenticated()需要身份认证成功才能访问。如果认证用户不是匿名用户则返回true认证通过isFullyAuthenticated():需要身份认证成功才能访问。如果认证用户不是匿名用户或记住我的用户则返回true认证通过其它自行查找......--!--开始配置拦截规则注意拦截规则的位置顺序如不需要身份认证的规则要放在前面需要身份认证的规则放在后面--!--permitAll()不需要身份认证无条件放行--!--security:intercept-url pattern/login accesspermitAll()/--security:intercept-url pattern/system/index accesspermitAll()/security:intercept-url pattern/s_timeout.jsp accesspermitAll()/!--进行权限划分hasRole(ROLE_USER)表示拥有 ROLE_USER 权限的用户可以访问hasRole(ROLE_ALL)表示拥有 ROLE_ALL 权限的用户可以访问--security:intercept-url pattern/system/add accesshasAuthority(admin)/security:intercept-url pattern/system/list accesshasAuthority(ROLE_ALL)/!--permitAll()不需要身份认证无条件放行静态资源--security:intercept-url pattern/js/** accesspermitAll()/!--拦截所有页面需要身份认证成功才能访问。如果认证用户不是匿名用户或记住我的用户则返回true认证通过--security:intercept-url pattern/** accessisFullyAuthenticated()/!--结束配置拦截规则--!-- 自定义用户访问权限不足的处理方式(需要编写controller返回权限不足的页面) --security:access-denied-handler error-page/accessDeny/!-- session管理invalid-session-url指定使用已经超时的sessionId保存在Cookie中进行请求需要重定向的页面或路径。max-sessions默认值为1session并发数量控制。控制同一用户在系统中同时允许存在的已经通过认证的session数量。当超过这个值时Spring Security的默认策略是将先前的设为无效。如果要限制用户再次登录可以设置concurrency-control的error-if-maximum-exceeded的值为true。--security:session-management invalid-session-url/s_timeout.jspsecurity:concurrency-control max-sessions1 error-if-maximum-exceededfalse//security:session-management!--security:session-management session-authentication-error-url/session invalid-session-url/sessionsecurity:concurrency-control max-sessions1 session-registry-aliassessionRegistry error-if-maximum-exceededfalse expired-url/session//security:session-management--!--加上Remember Me功能token-validity-seconds有效时间(秒)--!--security:remember-me token-repository-refjdbcTokenRepository token-validity-seconds604800/--!--security:logout/注销功能logout-url/logout退出过滤器默认的拦截路径springSecurity内LogoutFilter要拦截的url(向这/logout发送请求来注销)logout-success-url用户退出后要被重定向的urlinvalidate-session默认为true,用户在退出后Http session失效success-handler-ref指定一个bean(需要实现LogoutSuccessHandler接口)用来自定义退出成功后的操作delete-cookiesJSESSIONID删除session对应的cookie--security:logout logout-url/logout logout-success-url/login invalidate-sessiontrue delete-cookiesJSESSIONID//security:http!--身份验证管理器--security:authentication-manager!--自定义授权提供类MyUserDetailsService获得登录用户的用户详情信息。此类实现UserDetailsService接口。user-service-refmyUserDetailsService 指定 UserDetailsService 接口的实现类最终都要返回一个UserDetail用户详情--security:authentication-provider user-service-refmyUserDetailsService!-- 配置加密算法对用户输入的密码进行加密然后和数据库的密码进行配对 --!--security:password-encoder refbCryptPasswordEncoder/--/security:authentication-provider/security:authentication-manager!--创建 springSecurity 密码加密工具类使用PasswordEncoder 接口的实现也可以使用别的--!--bean idbCryptPasswordEncoder classorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder/bean--!--springSecurity实现 remember me 功能如果用户登录选择 remember me springSecurity会将其cookie值存入数据库来实现remember me 功能JdbcTokenRepositoryImpl 用来存取cookie值--!--bean idjdbcTokenRepository classorg.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImplproperty namedataSource refdataSource/ lt;!ndash;数据库数据源ndash;gt;lt;!ndash;property namecreateTableOnStartup valuetrue/ndash;gt; lt;!ndash;createTableOnStartup属性是当项目启动时springSecurity创建表存储remember me相关信息第二次启动时要注释这个属性ndash;gt;/bean--/beans如此配置运行效果点击退出后重定向到了登录页面。即logout-success-url/login配置生效。 退出页面代码 div %-- form actionc:url value/logout/ methodpostinput idlogout typesubmit value退出系统/form--%a hrefc:url value/logout/退出系统/a /div 另外再看看退出时的 delete-cookiesJSESSIONID 配置如下idea控制台的截图可以看出退出后重定向到退出的Controller请求时session ID重新生成了说明浏览器cookies中的上一次JSESSIONID已经失效。 好了小伙伴们这篇文章就到这里了希望多留下你们的足迹谢谢。
http://www.zqtcl.cn/news/690899/

相关文章:

  • 青海网站建设费用oa系统和erp系统区别
  • 个人做网站的注意事项网站开发工程师6
  • 镇江百度网站建设北京网站开发价格
  • 大岭山镇仿做网站推广计划表格
  • 网站备案地址不是我的地址怎么办建设银行网站查询业务收费吗
  • 电商网站设计内容网站编辑及seo招聘
  • 用什么网站开发浙江省住房和建设厅网站
  • 站长工具seo优化建议微信小程序线上商城怎么申请
  • 建筑网站开发设计做网站的公司msgg
  • 设计师个人网站模板网站的尾页要怎么做
  • 营销型网站建设风格设定包括哪些方面wordpress企业魔板
  • 怎样做淘客网站做绿色产品的网站
  • 关于网站建设的通知wordpress点注册后一直不出来
  • 科技公司网站设计方案开发公司绩效考核
  • 深圳网站建设推进旗县政务网站建设工作方案
  • 南宁 网站建设网站集约建设
  • 做网站编辑好吗吉林省四平市
  • 石家庄网站制作最新军事新闻最新消息视频
  • 高端品牌网站设计企业网站建设wordpress文章前阅读
  • 广州做网站星珀各电商网站的特点
  • 西安模板做网站广州微信网站建设平台
  • 网站开发硬件工程师待遇微信商城有哪些第三方平台
  • 基于响应式设计的网站建设软件开发项目甘特图
  • 绍兴兴住房和城乡建设局网站网站更换名称需要重新备案吗
  • 跨境电商网站开发文档网站建设费可摊几年
  • 怎样建设一个游戏网站随便玩玩在线制作网站
  • 免费的成品网站用织梦模板做网站
  • 彩票网站开发 极云有的域名怎样做网站
  • 网店运营推广网站买个天猫店多少钱一个
  • 资讯网站排版广告公司取名大全集