求助,我是新手,这是一个拖动图片验证登陆陆的方法checklogin

讨论:一种更好的登录验证和密码保存算法解决办法 - ASP.NET当前位置:& &&&讨论:一种更好的登录验证和密码保存算法解决办法讨论:一种更好的登录验证和密码保存算法解决办法&&网友分享于:&&浏览:43次讨论:一种更好的登录验证和密码保存算法对于防止黑客攻击,没有最安全的方法,只有更安全的方法,web的登录验证机制的安全性其实还是很脆弱的,但我们可以不断改进。目前我们的项目中存在的一个大问题是:我们将用对称加密(DES)加密过的用户名写到了cookie中去以便记录用户的登录状态,这样可能产生较大的隐患:一是只要能够截获一个用户的http报文,即可冒充这个用户来使用我们的系统& 二是一旦知道我们的加密方法(比如利用网站的其它漏洞或其它途径获取了我们的源码)就能随意伪造登录信息实现无任何限制的操作目前考虑改进,达到以下的安全目标:Cookie的登录信息是加密的,不可逆转的,即便攻击者获取了我们的源码,他也不能反向获取到明文用户信息(如果不需要长期保存登录状态,可以考虑不在cookie中存放任何用户信息,只存放Token)& Cookie的登录信息是无法伪造的,即便攻击者获取了我们的源码,但由于攻击者不能访问我们的数据库,他仍然无法伪造登录Cookie& 如果Cookie的登录信息是通过截获http报文伪造的,我们能够识别(可能需要根据IP地址和端口等额外信息)& ------解决方案--------------------https或者隐式的SSL通信签名,根本不能被篡改。这样的cookie已经很安全了。除非客户机出现安全问题。然而责任,不就是用来推的么。
------解决方案--------------------
1)在cookie中,保存三个东西——用户名,登录序列,登录token。用户名:明文存放。登录序列:一个被MD5散列过的随机数,仅当强制用户输入口令时更新(如:用户修改了口令)。登录token:一个被MD5散列过的随机数,仅一个登录session内有效,新的登录session会更新它。2)上述三个东西会存在服务器上,服务器的验证用户需要验证客户端cookie里的这三个事。3)这样的设计会有什么样的效果,会有下面的效果,a)登录token是单实例登录。意思就是一个用户只能有一个登录实例。b)登录序列是用来做盗用行为检测的。如果用户的cookie被盗后,盗用者使用这个cookie访问网站时,我们的系统是以为是合法用户,然后更新“登录token”,而真正的用户回来访问时,系统发现只有“用户名”和“登录序列”相同,但是“登录token” 不对,这样的话,系统就知道,这个用户可能出现了被盗用的情况,于是,系统可以清除并更改登录序列 和 登录token,这样就可以令所有的cookie失效,并要求用户输入口令。并给警告用户系统安全。4)当然,上述这样的设计还是会有一些问题,比如:同一用户的不同设备登录,甚至在同一个设备上使用不同的浏览器保登录。一个设备会让另一个设备的登录token和登录序列失效,从而让其它设备和浏览器需要重新登录,并会造成cookie被盗用的假象。所以,你在服务器服还需要考虑- IP 地址,a) 如果以口令方式登录,我们无需更新服务器的“登录序列”和 “登录token”(但需要更新cookie)。因为我们认为口令只有真正的用户知道。b) 如果 IP相同 ,那么,我们无需更新服务器的“登录序列”和 “登录token”(但需要更新cookie)。因为我们认为是同一用户有同一IP(当然,同一个局域网里也有同一IP,但我们认为这个局域网是用户可以控制的。网吧内并不推荐使用这一功能)。c) 如果 (IP不同 && 没有用口令登录),那么,“登录token” 就会在多个IP间发生变化(登录token在两个或多个ip间被来来回回的变换),当在一定时间内达到一定次数后,系统才会真正觉得被盗用的可能性很高,此时系统在后台清除“登录序列”和“登录token“,让Cookie失效,强制用户输入口令(或是要求用户更改口令),以保证多台设备上的cookie一致。
------解决方案--------------------session+cookies如果是后台登陆操作。。。可以加上IP白名单。。。只允许某几个IP去登陆后台。。。
------解决方案--------------------
如果你不想做https的话,报文截取这个漏洞永远无法避开啊。伪造http报头不是很容易的事。只有人工模拟https的访问机制了。客户器端维护一个内存表theTguidtokencookie_private_keysession_begintime1)用户访问网站& session_onstar 中给出一对会话公密钥。公钥写cookie中cookit[&session_public_key&]& 私钥放session中 session[&session_private_key&]当前时间放入sesison中的session[&session_beginTime&].theT中新加一条theGuidString = new guid().tostring();theTokenString =
new guid().tostring();theGuidString ,theTokenString ,session[&session_private_key&],session[&session_beginTime&]session[&theGuidString&]=theGuidSsession[&theTokenString&]=theTokenS2)用户被重定向到 cookielogin.aspx3) cookielogin.aspx中用js打开cookie[&public_key&],用RSA算法解密cookie[&token&],得到的明文token使用cookit[&session_public_key&]加密,提交到&cookielogincheck.aspx?guid=& +cookie[&guid&] + &&token=& + cookie[&token&]。4)cookielogincheck.aspx中取得guid,和token在theT中查到cookie_private_key(查不到跳到输入用户名密码登录页)将cookie[&token&]用session_private_key解密后得到的token原文与theT中得到的token对比。确定是否是上一次成功登录的用户。(查不到跳到输入用户名密码登录页)删除原cookie[&guid&]对应的theT记录更新cookie[&guid&]为session[&theGuidString&]更新cookie[&token&]为session[&theGuidString&]使用session[&session_private_key&]加密后的串更新cookie[&public_key&] = session[&session_public_key&]5)定时根据session_begintime清除theT中过期的记录。这样不同的session用同一个cookie也没有办法了。
------解决方案-------------------- 共&2&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有当前位置: →
→ JSP做一个用户登录验证页面,验证登陆成功后怎么控制另一个frame页面的跳转呢
JSP做一个用户登录验证页面,验证登陆成功后怎么控制另一个frame页面的跳转呢
& 作者:佚名 & 来源: 互联网 & 热度:
&收藏到→_→:
摘要: JSP做一个用户登录验证页面,验证登陆成功后如何控制另一个frame页面的跳转呢jsp做一个用户登录验证页面,提交到验证页面,验证...
"JSP做一个用户登录验证页面,验证登陆成功后怎么控制另一个frame页面的跳转呢"::
jsp做一个用户登录验证页面,验证登陆成功后如何控制另一个frame页面的跳转呢jsp做一个用户登录验证页面,提交到验证页面,验证成功后转到登陆成功界面,可是如何控制另一个框架页面也同时跳转到一个登录成功用户的页面(我的主页面有3个框架页,一个是填写登陆信息页面,一个是链接项目页面(登陆与否该页面显示不同)我用的是jsp+javabean来做的,我看书上有这部分功能只是没提供代码,我是login.jsp填写好登陆信息后,提交到login_check.jsp,login_check.jsp中验证成功后,用sendredirect()重定向,可是重定向的只是我提交信息的那部分框架页面,我想frame页面也跳转------解决方案--------------------window.parent.leftframe.location.href=&xxxx.jsp&;根据你自己的页面结构来取得需要跳转的页面。leftframe是你定义的frame
------解决方案--------------------探讨我的主页面有3个框架页,一个是填写登陆信息页面,一个是链接项目页面(登陆与否该页面显示不同) 搜索此文相关文章:P做一个用户登录验证页面,验证登陆成功后怎么控制另一个frame页面的跳转呢此文来自: 马开东博客
网址: 站长QQ
上一篇:没有了
JSP做一个用户登录验证页面,验证登陆成功后怎么控制另一个frame页面的跳转呢_JavaWeb相关文章
JavaWeb_总排行榜
JavaWeb_最新
JavaWeb_月排行榜
JavaWeb_周排行榜
JavaWeb_日排行榜登录验证全局控制的几种方式(session)
在登陆验证或者其他需要用到session全局变量的时候,归结起来,主要有以下三种较方便的实现方式。(其中个人较喜欢使用第一种实现方法)一,在一个公共类里创建一个公共方法,然后需要验证的页面都调用这个方法 ...
在登陆验证或者其他需要用到session全局变量的时候,归结起来,主要有以下三种较方便的实现方式。(其中个人较喜欢使用第一种实现方法)
一,在一个公共类里创建一个公共方法,然后需要验证的页面都调用这个方法
//在此例子中,就是在入口函数里调用CheckLogin()方法;[html]
public static string SeUserID
return HttpContext.Current.Session["SeUserID"].ToString();
HttpContext.Current.Session["SeUserID"] =
/// &summary&
/// 检查用户是否登录,如果未登录就转到登录页面
/// &/summary&
public static void CheckLogin()
if (SeUserID == "" || SeUserID == "0")
HttpContext.Current.Response.Redirect("ForeignFirms.x");
//HttpContext.Current.Response.Write("&script&window.open('');alert('登陆失效,请重新登陆');&/script&");
public static string SeUserID
return HttpContext.Current.Session["SeUserID"].ToString();
HttpContext.Current.Session["SeUserID"] =
/// &summary&
/// 检查用户是否登录,如果未登录就转到登录页面
/// &/summary&
public static void CheckLogin()
if (SeUserID == "" || SeUserID == "0")
HttpContext.Current.Response.Redirect("ForeignFirms.aspx");
//HttpContext.Current.Response.Write("&script&window.open('');alert('登陆失效,请重新登陆');&/script&");
//在cs页面调用验证方法
protected void Page_Load(object sender, EventArgs e)
monFunction.CheckLogin();//验证登陆信息
if (!IsPostBack)
GetData();
value = Request.QueryString["id"].ToString();
if (value != "0")
GetEdit();
//在cs页面调用验证方法
protected void Page_Load(object sender, EventArgs e)
monFunction.CheckLogin();//验证登陆信息
if (!IsPostBack)
GetData();
value = Request.QueryString["id"].ToString();
if (value != "0")
GetEdit();
}二,通过Global文件来控制
protected void Session_Start(Object sender, EventArgs e)
Session["sqlConnectionString"] = "uid=Upwd=database=MyTserver=LConnect Timeout=300";
  }   
protected void Session_Start(Object sender, EventArgs e)
Session["sqlConnectionString"] = "uid=Upwd=database=MyTserver=LConnect Timeout=300";
  }   
--读取的方法,在代码中的应用[html] view plaincopyprint?
String strConnection=Session["sqlConnectionString"].ToString();
  sqlConnection_1=new SqlConnection(strConnection);
String strConnection=Session["sqlConnectionString"].ToString();
  sqlConnection_1=new SqlConnection(strConnection); 三,通过Web.Config文件配置
//配置Web.Config文件的方法如下:
在Web.Config文件的&system.web&&/system.web&节点中添加如下代码,设置Session的生命周期为10分钟。
&sessionState mode="InProc" timeout="10"&&/sessionState&
&sessionState mode="InProc" timeout="10"&&/sessionState&
在web.config文件中设置Session时,可以设置以下几个参数:[html] view plaincopyprint?
Mode//该参数用于设置存储会话状态。状态包括Off、Inproc、StateServer和SqlServer。
Off//表示禁用会话状态
Inproc//表示工作进程自身存储会话状态
StateServer//表示将把会话信息存放在一个单独的ASP.NET状态服务中
SqlServe//r表示将把会话信息存放在SQL Server中。
StateConnecitonString//该参数用于设置ASP.NET应用程序存储远程会话状态的服务器名,默认名为本地。
Cookieless//当该参数值设置为True时,表示不使用Cookie//会话标识客,反之设置为False时,标识启动Cookie会话状态。
SqlConnectionString//该参数用于设置SQL Server数据库连接。
Timeout//该参数用于设置会话时间,超过该期限,会自动中断会话,默认设置为20。9053人阅读
Mybatis(12)
SpringMVC(8)
Spring(24)
& & &摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+tomcat7.这里主要说了Shiro的搭建过程,Spring+SpringMVC+Mybatis的搭建过可以看这里整体工程免费下载:最终效果如下:工程整体的目录如下:java代码如下:配置文件如下:页面资源如下:好了,下面来简单说下过程吧!准备工作:先建表:drop
CREATE TABLE `user` (
`id` int(11) primary key auto_increment,
`name` varchar(20)
`age` int(11) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`password` varchar(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user values(1,'lin',12,'','123456');
insert into user values(2,'apple',34,'','123456');
insert into user values(3,'evankaka',23,'','123456');建好后,新建一个Maven的webApp的工程,记得把结构设置成上面的那样!下面来看看一些代码和配置1、POM文件注意不要少导包了,如果项目出现红叉,一般都是JDK版本的设置问题,自己百度一下就可以解决&project xmlns=&http://maven.apache.org/POM/4.0.0& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.lin&/groupId&
&artifactId&ShiroLearn1&/artifactId&
&packaging&war&/packaging&
&version&0.0.1-SNAPSHOT&/version&
&name&ShiroLearn1 Maven Webapp&/name&
&url&http://maven.apache.org&/url&
&properties&
&!-- spring版本号 --&
&spring.version&3.2.8.RELEASE&/spring.version&
&!-- log4j日志文件管理包版本 --&
&slf4j.version&1.6.6&/slf4j.version&
&log4j.version&1.2.12&/log4j.version&
&!-- junit版本号 --&
&junit.version&4.10&/junit.version&
&!-- mybatis版本号 --&
&mybatis.version&3.2.1&/mybatis.version&
&/properties&
&dependencies&
&!-- 添加Spring依赖 --&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context-support&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-aop&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-aspects&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-tx&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-jdbc&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&!--单元测试依赖 --&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&${junit.version}&/version&
&scope&test&/scope&
&/dependency&
&!-- 日志文件管理包 --&
&!-- log start --&
&dependency&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&version&${log4j.version}&/version&
&/dependency&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-api&/artifactId&
&version&${slf4j.version}&/version&
&/dependency&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-log4j12&/artifactId&
&version&${slf4j.version}&/version&
&/dependency&
&!-- log end --&
&!--spring单元测试依赖 --&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-test&/artifactId&
&version&${spring.version}&/version&
&scope&test&/scope&
&/dependency&
&!--mybatis依赖 --&
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis&/artifactId&
&version&${mybatis.version}&/version&
&/dependency&
&!-- mybatis/spring包 --&
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis-spring&/artifactId&
&version&1.2.0&/version&
&/dependency&
&!-- mysql驱动包 --&
&dependency&
&groupId&mysql&/groupId&
&artifactId&mysql-connector-java&/artifactId&
&version&5.1.29&/version&
&/dependency&
&!-- servlet驱动包 --&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&servlet-api&/artifactId&
&version&3.0-alpha-1&/version&
&/dependency&
&!-- Spring 整合Shiro需要的依赖 --&
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-core&/artifactId&
&version&1.2.1&/version&
&/dependency&
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-web&/artifactId&
&version&1.2.1&/version&
&/dependency&
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-ehcache&/artifactId&
&version&1.2.1&/version&
&/dependency&
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-spring&/artifactId&
&version&1.2.1&/version&
&/dependency&
&!-- Spring 整合Shiro需要的依赖 --&
&/dependencies&
&finalName&ShiroLearn1&/finalName&
&!-- 指定web项目 版本 --&
&artifactId&maven-war-plugin&/artifactId&
&configuration&
&version&2.4&/version&
&/configuration&
&!-- 指定编译使用 --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-compiler-plugin&/artifactId&
&version&2.3.2&/version&
&configuration&
&source&1.6&/source&
&target&1.6&/target&
&/configuration&
&/plugins&
&/project&
2、自定义Shiro拦截器& &这里这个拦截器完成了用户名和密码的验证,验证成功后又给用赋角色和权限(注意,这里赋角色和权限我直接写进去了,没有使用数据库,一般都是要通过service层找到用户名后,再去数据库查该用户对应的角色以及权限,然后再加入到shiro中去)代码如下:package com.lin.
import java.util.HashS
import java.util.S
import org.apache.shiro.authc.AuthenticationE
import org.apache.shiro.authc.AuthenticationI
import org.apache.shiro.authc.AuthenticationT
import org.apache.shiro.authc.SimpleAuthenticationI
import org.apache.shiro.authc.UsernamePasswordT
import org.apache.shiro.authz.AuthorizationI
import org.apache.shiro.authz.SimpleAuthorizationI
import org.apache.shiro.cache.C
import org.apache.shiro.realm.AuthorizingR
import org.apache.shiro.subject.PrincipalC
import org.apache.shiro.subject.SimplePrincipalC
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.beans.factory.annotation.A
import com.lin.domain.U
import com.lin.service.UserS
import com.lin.utils.CipherU
public class ShiroDbRealm extends AuthorizingRealm {
private static Logger logger = LoggerFactory.getLogger(ShiroDbRealm.class);
private static final String ALGORITHM = &MD5&;
@Autowired
private UserService userS
public ShiroDbRealm() {
* 验证登陆
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcT
System.out.println(token.getUsername());
User user = userService.findUserByLoginName(token.getUsername());
System.out.println(user);
CipherUtil cipher = new CipherUtil();//MD5加密
if (user != null) {
return new SimpleAuthenticationInfo(user.getName(), cipher.generatePassword(user.getPassword()), getName());
throw new AuthenticationException();
* 登陆成功之后,进行角色和权限验证
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
/*这里应该根据userName使用role和permission 的serive层来做判断,并将对应 的权限加进来,下面简化了这一步*/
Set&String& roleNames = new HashSet&String&();
Set&String& permissions = new HashSet&String&();
roleNames.add(&admin&);//添加角色。对应到index.jsp
roleNames.add(&administrator&);
permissions.add(&create&);//添加权限,对应到index.jsp
permissions.add(&login.do?main&);
permissions.add(&login.do?logout&);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
info.setStringPermissions(permissions);
* 清除所有用户授权信息缓存.
public void clearCachedAuthorizationInfo(String principal) {
SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
clearCachedAuthorizationInfo(principals);
* 清除所有用户授权信息缓存.
public void clearAllCachedAuthorizationInfo() {
Cache&Object, AuthorizationInfo& cache = getAuthorizationCache();
if (cache != null) {
for (Object key : cache.keys()) {
cache.remove(key);
// @PostConstruct
// public void initCredentialsMatcher() {//MD5鍔犲瘑
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(ALGORITHM);
setCredentialsMatcher(matcher);
3、shiro的配置文件 :spring-shiro.xml内容如下:&?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/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&
default-lazy-init=&true&&
&description&Shiro Configuration&/description&
&!-- Shiro's main business-tier object for web-enabled applications --&
&bean id=&securityManager& class=&org.apache.shiro.web.mgt.DefaultWebSecurityManager&&
&property name=&realm& ref=&shiroDbRealm& /&
&property name=&cacheManager& ref=&cacheManager& /&
&!-- 項目自定义的Realm --&
&bean id=&shiroDbRealm& class=&com.lin.realm.ShiroDbRealm&&
&property name=&cacheManager& ref=&cacheManager& /&
&!-- Shiro Filter --&
&bean id=&shiroFilter& class=&org.apache.shiro.spring.web.ShiroFilterFactoryBean&&
&property name=&securityManager& ref=&securityManager& /&
&property name=&loginUrl& value=&/login.do& /&
&property name=&successUrl& value=&/view/index.html& /&
&property name=&unauthorizedUrl& value=&/error/noperms.jsp& /&
&property name=&filterChainDefinitions&&
/index.html = authc
/checkLogin.do = anon
/login.do = anon
/logout.html = anon
/** = authc
&/property&
&!-- 用户授权信息Cache --&
&bean id=&cacheManager& class=&org.apache.shiro.cache.MemoryConstrainedCacheManager& /&
&!-- 保证实现了Shiro内部lifecycle函数的bean执行 --&
&bean id=&lifecycleBeanPostProcessor& class=&org.apache.shiro.spring.LifecycleBeanPostProcessor& /&
&!-- AOP式方法级权限检查 --&
&bean class=&org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator&
depends-on=&lifecycleBeanPostProcessor&&
&property name=&proxyTargetClass& value=&true& /&
&bean class=&org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor&&
&property name=&securityManager& ref=&securityManager& /&
&/beans&这里简要说明下:(1)securityManager:这个属性是必须的。loginUrl:没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。successUrl:登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。unauthorizedUrl:没有权限默认跳转的页面。(2)anon:例子/admins/**=anon 没有参数,表示可以匿名使用。authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles[&admin,guest&],每个参数通过才算通过,相当于hasAllRoles()方法。perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms[&user:add:*,user:modify:*&],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为httpsuser:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查注:anon,authcBasic,auchc,user是认证过滤器,perms,roles,ssl,rest,port是授权过滤器4、web.xml配置解读shiro的配置文件(上面的)&?xml version=&1.0& encoding=&UTF-8&?&
&web-app xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns=&/xml/ns/javaee& xmlns:web=&/xml/ns/javaee/web-app_2_5.xsd&
xsi:schemaLocation=&/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd&
id=&WebApp_ID& version=&2.5&&
&display-name&Archetype Created Web Application&/display-name&
&!-- 起始欢迎界面 --&
&welcome-file-list&
&welcome-file&/login.do&/welcome-file&
&/welcome-file-list&
&!-- 读取spring配置文件 --&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:application.xml,classpath:shiro/spring-shiro.xml&/param-value&
&/context-param&
&!-- 设计路径变量值 --&
&context-param&
&param-name&webAppRootKey&/param-name&
&param-value&springmvc.root&/param-value&
&/context-param&
&!-- Spring字符集过滤器 --&
&filter-name&SpringEncodingFilter&/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&
&init-param&
&param-name&forceEncoding&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&SpringEncodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&filter-name&shiroFilter&/filter-name&
&filter-class&org.springframework.web.filter.DelegatingFilterProxy&/filter-class&
&init-param&
&param-name&targetFilterLifecycle&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&shiroFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&!-- 日志记录 --&
&context-param&
&!-- 日志配置文件路径 --&
&param-name&log4jConfigLocation&/param-name&
&param-value&classpath:log4j.properties&/param-value&
&/context-param&
&context-param&
&!-- 日志页面的刷新间隔 --&
&param-name&log4jRefreshInterval&/param-name&
&param-value&6000&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.util.Log4jConfigListener&/listener-class&
&/listener&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&!-- 防止spring内存溢出监听器 --&
&listener&
&listener-class&org.springframework.web.util.IntrospectorCleanupListener&/listener-class&
&/listener&
&!-- springMVC核心配置 --&
&servlet-name&dispatcherServlet&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&param-name&contextConfigLocation&/param-name&
&!--spingMVC的配置路径 --&
&param-value&classpath:springmvc/spring-mvc.xml&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&!-- 拦截设置 --&
&servlet-mapping&
&servlet-name&dispatcherServlet&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
&!-- 配置session超时时间,单位分钟 --&
&session-config&
&session-timeout&15&/session-timeout&
&/session-config&
&error-page&
&error-code&404&/error-code&
&location&/WEB-INF/views/error/404.jsp&/location&
&/error-page&
&error-page&
&error-code&401&/error-code&
&location&/WEB-INF/views/error/401.jsp&/location&
&/error-page&
&/web-app&这里不仅配置了SpringMVC还要配置Shiro!5、登陆页面login.jsp以下是默认登陆的界面&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
String url = request.getRequestURL().toString();
url = url.substring(0, url.indexOf('/', url.indexOf(&//&) + 2));
String context = request.getContextPath();
application.setAttribute(&ctx&, url);
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&Insert title here&/title&
&form action=&${ctx}/checkLogin.do& method=&post&&
username: &input type=&text& name=&username&&&br&
password: &input type=&password& name=&password&&&br&
&input type=&submit& value=&登录&&
&/html&6、验证成功页面index.jsp如果用户名和密码正确后,跳转到的页面&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
&%@ taglib prefix=&shiro& uri=&http://shiro.apache.org/tags&%&
String url = request.getRequestURL().toString();
url = url.substring(0, url.indexOf('/', url.indexOf(&//&) + 2));
String context = request.getContextPath();
application.setAttribute(&ctx&, url);
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&Shiro登陆实例&/title&
&h1&Shiro登陆实例&/h1&&a href=&${ctx}/logout.html&&退出&/a&
&p&一、验证当前用户是否为&访客&,即未认证(包含未记住)的用户&/p&
&shiro:guest&
Please &a href=&login.jsp&&Login&/a& or &a href=&signup.jsp&&Signup&/a& today!
&/shiro:guest&
&p&二、认证通过或已记住的用户&/p&
&shiro:user&
Welcome back John!
Not John? Click &a href=&login.jsp&&here&a& to login.
&/shiro:user&
&p&三、已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。&/p&
&shiro:authenticated&
&a href=&updateAccount.jsp&&Update your contact information&/a&.
&/shiro:authenticated&
&p&四、未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。&/p&
&shiro:notAuthenticated&
Please &a href=&login.jsp&&login&/a& in order to update your credit card information.
&/shiro:notAuthenticated&
&p&五、输出当前用户信息,通常为登录帐号信息&/p&
Hello, &shiro:principal/&, how are you today?
&p&六、验证当前用户是否属于该角色&/p&
&shiro:hasRole name=&administrator&&
&a href=&admin.jsp&&Administer the system&/a&
&/shiro:hasRole&
&p&七、与hasRole标签逻辑相反,当用户不属于该角色时验证通过&/p&
&shiro:lacksRole name=&administrator&&
Sorry, you are not allowed to administer the system.
&/shiro:lacksRole&
&p&八、验证当前用户是否属于以下任意一个角色。&/p&
&shiro:hasAnyRoles name=&developer,manager,administrator&&
You are either a developer,manager, or administrator.
&/shiro:hasAnyRoles&
&p&九、验证当前用户权限。&/p&
&shiro:hasPermission name=&create&&
&p&当前用户拥有增加的权限!!!!!!!!!!!!!&/p&
&/shiro:hasPermission&
&shiro:hasPermission name=&delete&&
&p&当前用户拥有删除的权限!!!!!!!!!!!!!&/p&
&/shiro:hasPermission&
&/html&其它页面就不说了,具体看工程吧!7、controller层来看看这里/{id}/showUser主要是来验证是否连接成功(现在无法测试了),当然在工程里你也可以到src/test/java里的包com.lin.service下的UserServiceTest.java,那里我也写了一个单元测试的类。package com.lin.
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.shiro.SecurityU
import org.apache.shiro.authc.UsernamePasswordT
import org.apache.shiro.subject.S
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.C
import org.springframework.ui.M
import org.springframework.web.bind.annotation.PathV
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.ResponseB
import com.lin.domain.U
import com.lin.realm.ShiroDbR
import com.lin.service.UserS
import com.lin.utils.CipherU
@Controller
public class UserControler {
private static Logger logger = LoggerFactory.getLogger(ShiroDbRealm.class);
@Autowired
private UserService userS
* 验证springmvc与batis连接成功
* @param id
* @param request
@RequestMapping(&/{id}/showUser&)
public String showUser(@PathVariable int id, HttpServletRequest request) {
User user = userService.getUserById(id);
System.out.println(user.getName());
request.setAttribute(&user&, user);
return &showUser&;
* 初始登陆界面
* @param request
@RequestMapping(&/login.do&)
public String tologin(HttpServletRequest request, HttpServletResponse response, Model model){
logger.debug(&来自IP[& + request.getRemoteHost() + &]的访问&);
return &login&;
* 验证用户名和密码
* @param request
@RequestMapping(&/checkLogin.do&)
public String login(HttpServletRequest request) {
String result = &login.do&;
// 取得用户名
String username = request.getParameter(&username&);
//取得 密码,并用MD5加密
String password = CipherUtil.generatePassword(request.getParameter(&password&));
//String password = request.getParameter(&password&);
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
Subject currentUser = SecurityUtils.getSubject();
System.out.println(&----------------------------&);
if (!currentUser.isAuthenticated()){//使用shiro来验证
token.setRememberMe(true);
currentUser.login(token);//验证角色和权限
System.out.println(&result: & + result);
result = &index&;//验证成功
} catch (Exception e) {
logger.error(e.getMessage());
result = &login。do&;//验证失败
@RequestMapping(value = &/logout&)
@ResponseBody
public String logout() {
Subject currentUser = SecurityUtils.getSubject();
String result = &logout&;
currentUser.logout();
再来看看效果吧!整体工程免费下载:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1554224次
积分:17029
积分:17029
排名:第574名
原创:275篇
评论:1276条
阅读:42693
阅读:72871
文章:13篇
阅读:83859
文章:18篇
阅读:139180
文章:23篇
阅读:218883
(10)(10)(10)(1)(10)(4)(10)(10)(1)(6)(4)(6)(3)(12)(10)(11)(12)(14)(21)(28)(13)(16)(15)(4)(2)(13)(16)(2)(1)

我要回帖

更多关于 icloud登陆验证失败 的文章

 

随机推荐