j2ee 简单网站搭建:(七)使用 shiro 结合 jcaptcha 实现用户验证登录

news/2024/5/20 11:31:58/文章来源:https://blog.csdn.net/weixin_34405332/article/details/91673233

为什么80%的码农都做不了架构师?>>>   hot3.png

《j2ee 简单网站搭建:(一) windows 操作系统下使用 eclipse 建立 maven web 项目》
《j2ee 简单网站搭建:(二)添加和配置 spring + spring-mvc 的 mvc 开发环境》
《j2ee 简单网站搭建:(三)在搭建好的 spring maven web 项目中加入 mybatis 访问数据库》
《j2ee 简单网站搭建:(四)将 freemaker 模板引擎作为 spring-mvc 展现层》
《j2ee 简单网站搭建:(五)使用 jcaptcha 生成验证码图片》
《j2ee 简单网站搭建:(六)使用 hibernate validation 实现 domain 层实体类验证》
《j2ee 简单网站搭建:(七)使用 shiro 结合 jcaptcha 实现用户验证登录》
《j2ee 简单网站搭建:(八)使用 jquery-validate 实现页面验证入门》
《j2ee 简单网站搭建:(九)jquery datatables + jquery ui dialog 插件使用入门》
《j2ee 简单网站搭建:(十)jquery ztree 插件使用入门》
《j2ee 简单网站搭建:(十一)ckeditor 控件使用入门》

shiro 要比 Spring Security 轻量简单。shiro 对于用户登录 session 默认会使用 ehcache 缓存,因此在加载 jar 包时也需要将 ehcache 引入。此外 shiro 默认使用正常的 request 提交方法完成验证请求,如果采用 ajax 方式登录,需要相对复杂的接口实现,在本文最后会简要介绍。使用 shiro 主要就是对需要用户自己实现的 AuthorizingRealm 和 FormAuthenticationFilter 两个类中相关方法进行重载,其次就是完成 shiro 配置文件的各个环节修改。jcaptcha 配置不在本文中说明,请参考本系列第五篇。

shiro 版本 1.4.0-RC2
ehcache 版本 3.3.1

一 在 pom.xml 中添加 shiro 需要的库

 <properties><shiro.version>1.4.0-RC2</shiro.version><ehcache.version>3.3.1</ehcache.version></properties><dependencies><!-- Apache 安全验证框架 shiro start --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-quartz</artifactId><version>${shiro.version}</version></dependency><!-- ehcache 缓存包 --><dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>${ehcache.version}</version></dependency><!-- Apache 安全验证框架 shiro end --></dependencies>

二 添加 ehcache 缓存配置文件 ehcache.xml 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache"><diskStore path="java.io.tmpdir"/><defaultCachemaxElementsInMemory="10000"maxElementsOnDisk="0"eternal="true"overflowToDisk="true"diskPersistent="false"timeToIdleSeconds="0"timeToLiveSeconds="0"diskSpoolBufferSizeMB="50"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LFU"/><cache name="categorytree"maxElementsInMemory="1000"maxElementsOnDisk="0"eternal="false"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="120"timeToLiveSeconds="300"diskSpoolBufferSizeMB="50"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LFU"/><cache name="normalcategorytree"maxElementsInMemory="1000"maxElementsOnDisk="0"eternal="false"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="120"timeToLiveSeconds="300"diskSpoolBufferSizeMB="50"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LFU"/>
</ehcache>
<!-- EHCache 参数含义name:cache标识maxElementsInMemory:设置基于内存的缓存可存放对象的最大数目maxElementOnDisk:设置基于硬盘的缓存可存放对象的最大数目(现在不设置,基于硬盘IO也会比较耗费时间)eternal:如果为true,表示对象永远不会过期,此时会忽略tiemToldleSeconds和timeToLiveSeconds属性,默认为false。timeToldleSeconds:设置允许对象处于空间状态的最长时间。当对象自动最近一次被访问后,如果处于空闲状态的时间超过了timeToldleSeconds属性值,这个对象就会过期。当对象过期,只有当eternal属性为false,该属性才有效。如果该属性的值为0,那么就表示该对象可以无限期地存于缓存中。timeToLiveSeconds必须大于timeToldleSeconds属性,才有意义。不需要配置此项。overflowToDisk:如果为true,表示当基于内存的缓存中的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到基于硬盘的缓存中。注意,如果缓存的对象要写入到硬盘中的话,则该对象必须时间了Serializable接口才行;memoryStoreEvictionPolicy:缓存清除策略:FIFO,LFU,LRU
-->

三 添加 spring-ehcache.xml 配置文件,连接 spring 和 ehcache ,该文件新建后需要在 web.xml 文件 <context-param> 节点的 <param-value> 参数节点中添加一行 spring-ehcache.xml 的配置信息,格式为 classpath*:spring-ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:cache="http://www.springframework.org/schema/cache"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache.xsd"><description>ehcache configuration</description><cache:annotation-driven cache-manager="cacheManager"/><bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"><property name="configLocation" value="classpath:ehcache.xml"/></bean><bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"><property name="cacheManager" ref="ehcacheManager"/><property name="transactionAware" value="true" /></bean>
</beans>

四 添加 spring-shiro-config.xml 配置文件,连接 spring 和 shiro ,该配置文件非常重要,具体节点含义请参照以下节点的注释。
需要提前说明的是 securityManager 节点中的 com.binux.webdemo.shiro.DBRealm 定义了用户如何进行认证。
节点 jCaptchaFormAuthenticationFilter 中的 com.binux.webdemo.shiro.JCaptchaFormAuthenticationFilter 定义了用户登录页面提交的和用户名、密码、验证码相关的控件名称和验证逻辑。
节点 shiroFilter 中的 <property name="loginUrl" value="/login"/> 定义了如果用户未认证会转向哪个待认证路径,也就是登录界面的请求路径,本例中为 /login ,该路径需要在 controller 包中有对应的类和方法处理该路径指向网站根目录下的 login.jsp 页面,本例中在 TestController.java 类的 login 方法中实现转向。
节点 shiroFIlter 中的 <property name="successUrl" value="/index"/> 定义了如果用户认证成功后会请求哪个路径, 本例为 /index,该路径需要在 controller 包中有对应的类和方法处理该路径指向网站根目录下的 index.jsp 页面,本例中在 TestController.java 类的 loginin 方法中实现转向。
节点 shiroFIlter 中的 <property name="filterChainDefinitions"> 定义了哪些路径需要验证,哪些可以排除,本例中除验证码图片的生成路径外其它所有路径都需要验证,所以配置为 /captcha/** = anon 和 /** = authc

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- Shiro配置开始 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- 指定Shiro验证用户登录的类为自定义的Realm(若有多个Realm,可使用[realms]属性代替) --><property name="realm"><bean class="com.binux.webdemo.shiro.DBRealm"/></property><!--Shiro默认会使用Servlet容器的Session,此时修改超时时间的话,可以修改web.xml或者这里自定义的MyRealm而若想使用Shiro原生Session则可以设置sessionMode属性为native,此时修改超时时间则只能修改MyRealm--><!-- <property name="sessionMode" value="native"/> --></bean><!-- 自定义form认证过虑器 --><!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 --><bean id="jCaptchaFormAuthenticationFilter" class="com.binux.webdemo.shiro.JCaptchaFormAuthenticationFilter"><!-- 表单中账号的input名称 --><property name="usernameParam" value="username" /><!-- 表单中密码的input名称 --><property name="passwordParam" value="password" /></bean><!-- Shiro主过滤器本身功能十分强大,其强大之处就在于它支持任何基于URL路径表达式的、自定义的过滤器的执行 --><!-- Web应用中,Shiro可控制的Web请求必须经过Shiro主过滤器的拦截,并且Shiro对基于Spring的Web应用提供了完美的支持 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- Shiro的核心安全接口,这个属性是必须的 --><property name="securityManager" ref="securityManager"/><!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会找Web工程根目录下的[/login.jsp] --><property name="loginUrl" value="/login"/><!-- 登录成功后要跳转的连接(本例中此属性用不到,因为登录成功后的处理逻辑已在LoginController中硬编码为main.jsp) --><property name="successUrl" value="/index"/><!--用户访问未授权的资源时,所显示的连接若想更明显的测试此属性可以修改它的值,比如unauthor.jsp然后用[xuanyu]登录后访问/admin/list.jsp就看见浏览器会显示unauthor.jsp--><property name="unauthorizedUrl" value="/login"/><!-- 自定义filter配置 --><property name="filters"><map><!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中 --><entry key="authc" value-ref="jCaptchaFormAuthenticationFilter" /></map></property><!--Shiro连接约束配置,即过滤链的定义更详细介绍,见本文最下方提供的Shiro-1.2.2内置的FilterChain说明下面value值的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的anon:它对应的过滤器里面是空的,什么都没做,另外.do和.jsp后面的*表示参数,比方说[login.jsp?main]这种authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的org.apache.shiro.web.filter.authc.FormAuthenticationFilter注意:对于类似资源,既有authc验证,也有anon允许匿名访问的情况下,需要将anon设置放在authc前面,才会生效--><property name="filterChainDefinitions"><value>/captcha/** = anon/** = authc</value></property></bean><!-- 保证实现了Shiro内部lifecycle函数的bean执行 --><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/><!-- Shiro配置结束 --></beans>

五 新建 shiro 用户处理代码,其中包括组装验证信息的 DBRealm.java 类、执行验证的 JCaptchaFormAuthenticationFilter.java 类
1 编写验证信息组装类 DBRealm.java ,实现 shiro 的 AuthorizingRealm 类,其中 doGetAuthenticationInfo 方法是由开发人员自己编写可被 shiro 使用的认证信息,包括用户名、密码、加密盐,此外向开发人员公开了 initCredentialsMatcher 方法,开发人员可以提供自己对密码的加密算法让 shiro 使用,shiro 使用开发人员提供的服务端保存的真实用户信息和客户端浏览器提交的信息使用开发人员的加密算法加密后进行对比,一致则认证成功。

package com.binux.webdemo.shiro;import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;import javax.annotation.PostConstruct;public class DBRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return new SimpleAuthorizationInfo();}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 交给AuthenticatdingRealm使用CredentialsMatcher进行密码匹配SimpleAuthenticationInfo info = new SimpleAuthenticationInfo("admin", // 用户名"7a8e3d4fdcf6e812aad08d23d2c6edbb", // 密文密码 这里明文是 adminByteSource.Util.bytes("442132dd5cfd9f1fd5464e8d527b80f7"), // 序列化后的盐getName()); // realm namereturn info;}@Overridepublic void clearCachedAuthorizationInfo(PrincipalCollection principals) {super.clearCachedAuthorizationInfo(principals);}@Overridepublic void clearCachedAuthenticationInfo(PrincipalCollection principals) {super.clearCachedAuthenticationInfo(principals);}@Overridepublic void clearCache(PrincipalCollection principals) {super.clearCache(principals);}@PostConstructpublic void initCredentialsMatcher() { ////该句作用是重写shiro的密码验证,让shiro用我自己的验证,这里用shiro标准MD5算法设置一些参数HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();matcher.setHashAlgorithmName("md5");matcher.setHashIterations(2);matcher.setStoredCredentialsHexEncoded(true);setCredentialsMatcher(matcher);}
}


2 编写执行验证的 JCaptchaFormAuthenticationFilter.java 类

package com.binux.webdemo.shiro;import com.octo.captcha.service.image.ImageCaptchaService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.beans.factory.annotation.Autowired;import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;public class JCaptchaFormAuthenticationFilter extends FormAuthenticationFilter {@Autowiredprivate ImageCaptchaService imageCaptchaService;/*** 尚未通过 shiro 验证时执行该方法,如果有特殊的验证逻辑都可以在该方法中加入* @param request* @param response* @return* @throws Exception*/@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {if(this.isLoginRequest(request, response)) // 是否请求登录页面,也可能只是加载页面,不是提交登录if(this.isLoginSubmission(request, response)) // 是否是提交登录认证return this.executeLogin(request, response); // 进行认证elsereturn true; // 否则返回未登录状态,页面转向需要登录认证的登录页面else { // 认证成功转向登录成功页面this.saveRequestAndRedirectToLogin(request, response);return false;}}@Overrideprotected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {AuthenticationToken token = createToken(request, response); //根据用户提交的登录 request 请求创建用户名、密码、验证码的登录 tokenif (token == null) // 如果传入的验证信息失效throw new IllegalStateException(FormatMessage.Admin_Login_TokenMissing);try {// 判断验证码是否输入正确if (!imageCaptchaService.validateResponseForID(((HttpServletRequest) request).getSession().getId(), // 获得验证码的输入值WebUtils.getCleanParam(request, FormatMessage.Form_Login_Captcha))) // 获得当前用户的sessionidthrow new AuthenticationException(FormatMessage.Admin_Login_CaptchaError);Subject subject = getSubject(request, response);// 登录认证[这里才是真正进行用户验证比对的核心方法]subject.login(token);return onLoginSuccess(token, subject, request, response);} catch (AuthenticationException e) {if (FormatMessage.Admin_Login_CaptchaError.equals(e.getMessage()))AuthenResult.getInst().setAuthenErrorMessage(FormatMessage.Admin_Login_CaptchaError);elseAuthenResult.getInst().setAuthenErrorMessage(FormatMessage.Admin_Login_Error);return onLoginFailure(token, e, request, response);}}
}

六 在网站根目录下新建 login.jsp 和 index.jsp 页面,未登录和登录不成功 转向 login.jsp 页面,登录成功后转向index.jsp 页面,login.jsp 页面中包含账号、密码和验证码的

<html>
<body><form id="loginform" name="loginform" role="form" action="login"method="post"><fieldset><div><input placeholder="username" id="username" name="username"type="text" autofocus></div><div><input placeholder="password" id="password" name="password"type="password"></div><div><img id="captchaimg" name="captchaimg" src="captcha/get"onclick="this.src='captcha/get?d=' + new Date().getTime()" /> <inputplaceholder="captcha" id="captcha" name="captcha" type="text"maxlength="4"></div><input type="submit" id="loginbutton" name="loginbutton"value="login" /></fieldset></form>
</body>
</html>
<html>
<body>
success
</body>
</html>

七 在 controller 层定义处理登录页面和登录成功页面的转向方法,因为其它认证逻辑都由 shiro 执行了,所以只需要在转向方法中实现转向页面即可,本例中添加 LoginController.java 类文件处理 http://localhost:8080/webdemo/login 请求。

package com.binux.webdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class LoginController {@RequestMapping(value="/login")public ModelAndView  login() {ModelAndView mv = new ModelAndView();mv.setViewName("login.jsp");return mv;}
}


八 shiro 认证只是基本功能之一,另一个主要功能是为类、方法、页面提供角色权限的管理,有兴趣可以自行研究。

转载于:https://my.oschina.net/ioooi/blog/1523593

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_827065.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建自定义主机头的网站集

当我们在一个SharePoint Web应用程序中创建新网站集时&#xff0c;虽然我们可以指定网站集的路径&#xff0c;但是网站集的主机头&#xff0c;似乎必须使用Web应用程序所定义的主机头。比如&#xff0c;当在“http://sp2010”这个Web应用程序中创建一个新网站集时&#xff0c;网…

针对importNew 网站中的《面试总结》一文中涉及到的问题,自己的一点总结(1)

Java相关 Java GC机制(重要程度:★★★★★) 主要从三个方面回答:GC是针对什么对象进行回收(可达性分析法)&#xff0c;什么时候开始GC(当新生代满了会进行Minor GC&#xff0c;升到老年代的对象大于老年代剩余空间时会进行Major GC)&#xff0c;GC做什么(新生代采用复制算法…

stack overflow--技术问答网站

转自&#xff1a;http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一个与程序相关的IT技术问答网站。用户可以在…

使用Python爬取大嘴巴巴网站

Anonymous驻中国办事处主任&#xff0c;私下搞了一个叫做“大嘴巴巴”的色*情网站。http://dazui88.com/ 这个网站烂的一逼&#xff0c;大家没事可以搞一搞它。今天我们试着爬取一下网站内容&#xff0c;回头交给网监姐。 1.首先我们观察大嘴巴巴最大的色请板块“轻松一刻”的U…

用户用浏览器访问一个网站的时候背后的过程与步骤是怎样的?

1. 用户访问网站的流程 用户访问网站的流程 用户在浏览器中输入 www.taobao.com 到显示页面的过程 1.1 访问流程 利用DNS协议进行域名解析 --> 建立tcp协议三次握手过程 --> 客户端发出访问网站相应页面请求&#xff08;发出http协议请求报文&#xff09; --…

用Halo打造自己的博客网站

用Halo打造自己的博客网站 我之前分别用过Django和Hexo搭建网站&#xff0c;Django是python的web框架&#xff0c;Hexo是Node.js的&#xff0c;纯前端的玩意儿&#xff0c;配置起来相当折腾&#xff0c;后来我又听说了Halo不错&#xff0c;就尝试按官方文档部署了一套&#xf…

论文 | 用迁移学习解释:电商网站的用户评论应如何优化排序?

小蚂蚁说&#xff1a; 2018年6月初&#xff0c;自然语言处理三大顶会之一NAACL (Annual Conference of the North American Chapter of the Association for Computational Linguistics)在美国新奥尔良举行&#xff0c;吸引了世界各地的自然语言处理等领域的学者参加。 据统计&…

原生javascript-放大镜效果(模仿购物网站)

思路: 效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>

SEO

开放分类&#xff1a; 搜索引擎优化、seo、网站优化、搜索优化、SEO技巧 目录 • SEO的概要 • SEO操作的分类 • SEO 十心 • 网站SEO中遇到的问题 • SEO展望 • 搜索引擎优化(SEO)专业术语 • SEO优势 SEO的概要 [编辑本段]SEO是Search Engine Optimization的缩写&#xff0…

WEB网站常见的攻击方式总结与原理分析

一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种常见的漏洞的简介与原理分析 一.跨站脚本攻击(xss) 恶意攻击者通过往Web页面里插入恶意html代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的html代码会被执行&#xff0c;从而达…

Web 性能优化: 图片优化让网站大小减少 62%

摘要&#xff1a; 压缩各种格式的图片。 原文&#xff1a;Web 性能优化&#xff1a; 图片优化让网站大小减少 62% 作者&#xff1a;前端小智 Fundebug经授权转载&#xff0c;版权归原作者所有。 这是 Web 性能优化的第二篇&#xff0c;上一篇在下面看点击查看&#xff1a; Web …

unity自动生成敌人_博主营地 | 如何生成WebGL发布到网站上分享你的游戏

在Unity社区分享经验&#xff0c;你也有机会获得官方推荐&#xff01;发稿入口&#xff1a;unity.cn/articles2020年度Unity价值博主、Unity价值专家招募中 更多Unity博主专属权益见文末网页快速试玩永远是让大家最容易接受的方法&#xff0c;以下是本期内容的视频完整版&#…

php matomo,Matomo4.2.1 发布,网站访问统计系统

Matomo 4.2.1 发布了。 Matomo 是一套基于 PHP5 MySQL 技术构建的开源网站访问统计系统&#xff0c;能够提供详细的统计信息&#xff0c;比如网页浏览人数、访问最多的页面、搜索引擎关键词等等流量分析功能。新的内容为了提高安全性&#xff0c;Matomo 用户界面创建的所有 coo…

php配置出问题,php.ini配置中有3处设置可能导致网站安全出问题

php.ini配置中有3处设置可能导致网站安全出问题发布时间&#xff1a;2020-03-24 10:14:37来源&#xff1a;亿速云阅读&#xff1a;828作者&#xff1a;小新php.ini配置中有3处设置可能导致网站安全出问题。那么是哪三处呢&#xff1f;跟着小编一起往下看吧。一定会对你们有所帮…

html 整站相对地址,网站代码使用“绝对地址“对SEO优化的重要性

摘要为什么网站代码使用“绝对地址”比“相对地址”更有利于SEO优化&#xff1f;1&#xff1a;防止有人恶意镜像网站&#xff1b;2&#xff1a;防止搜索引擎只收录二三级域名而不收录一级域名&#xff1b;3&#xff1a;省去了301重定向&#xff1b;3&#xff1a;提高网站权重&a…

spring boot security ajax_SpringBoot入门建站全系列(十一)Spring-security进行权限认证...

SpringBoot入门建站全系列&#xff08;十一&#xff09;Spring-security进行权限认证Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。一般来说&#xff0c;Web 应用的安全性包括用户…

centos nginx重启_企业级电商网站使用Nginx+Lua(OpenResty)实现高性能Web应用

简介OpenResty是一款基于Nginx的高性能负载均衡服务器容器&#xff0c;简单来说是NginxLua。结合了Lua语言来对Nginx进行扩展&#xff0c;使得在Nginx上具有web容器功能。使得可以使用lua脚本来进行web的开发。有了lua&#xff0c;我们可以借助于nginx的异步非阻塞的功能&#…

网站留言板防重复留言_摄影,你一定要知道的几个看图网站!

一开始入行学摄影&#xff0c;不管你是爱好还是职业&#xff0c; 相信都经常听到别人说&#xff1a;“多看片&#xff0c;多模仿”这句话吧&#xff01;确实&#xff0c;一开始没有自己的摄影想法时候&#xff0c;是需要多看看别人的片子&#xff0c;可以激发自己的灵感&#x…

centos 访问网页重启php_解决阿里云CentOS 7重启后网站无法访问的问题

摘要每次阿里云主机重启后&#xff0c;总是无法访问网站。查看进程也发现了 mysqld、php、nginx等都也启动了&#xff0c;ping 也没问题&#xff0c;但就是无法访问。经过一番排查&#xff0c;这是 CentOS 7 最新的 firewalld 防火墙引起的问题。参考解决方案用iptables-servic…

虚拟服务器seo,虚拟主机是什么?

基本定义虚拟主机&#xff0c;又称虚拟服务器、主机空间或是网页空间&#xff0c;是一种让单一服务器可以运行多个网站或服务的技术。虚拟并非指不存在&#xff0c;而是指空间是由实体的服务器延伸而来&#xff0c;其硬件系统可以是基于服务器群&#xff0c;或者单个服务器。其…