说明,因为我们的一个项目B使用spring mvc配置的登陆框架,所以对登陆控制全部交给了spring,导致我们如果想通过另一个项目A登陆到项目B就不太容易,具体是项目A登陆了,我们通过一个连接直接跳转到项目B,

前提,项目A用户名密码和项目B的用户名密码必须是一样的

难点:1.项目A用密文登陆,即前端JS对密码加密后传递给后天,但是项目B是明文直接传递给spring框架

思路:我开始通过debug往spring的代码里面寻求突破点,但是找了好长时间,发现跳转太多,不好找。后来,仔细想想,spring能通过什么来保存数据呢,当然是session啦

于是,就有下面的代码:

Set keySet = (Set)session.keySet();
Object val = null;
SecurityContextImpl securityContext = null;
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = null;
for(Object key : keySet){
val = session.get(key);
if(val != null){
securityContext = (SecurityContextImpl) val; //1. SecurityContextImpl
System.out.println(securityContext.getAuthentication());
usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) securityContext.getAuthentication();//2. UsernamePasswordAuthenticationToken System.out.println(JSONUtils.toJSONString(usernamePasswordAuthenticationToken));
String credentials = usernamePasswordAuthenticationToken.getCredentials()+""; //3.Credentials
if(credentials != null){
System.out.println("credentials============"+credentials);//通过直接打印可以发现该对象对应的实体
System.out.println(credentials);
}
Object principal = usernamePasswordAuthenticationToken.getPrincipal();
if(principal != null){
System.out.println("principal============"+principal);//通过直接打印可以发现该对象对应的实体
System.out.println(JSONUtils.toJSONString(principal));//通过json输出可以查看该对象中的具体属性值
}
List<GrantedAuthority> grantedAuthorities = (List<GrantedAuthority>)usernamePasswordAuthenticationToken.getAuthorities();
if(grantedAuthorities != null){
System.out.println("List<GrantedAuthority>============"+grantedAuthorities);//通过直接打印可以发现该对象对应的实体
System.out.println(JSONUtils.toJSONString(grantedAuthorities));
}
}
}

通过查看所有的get方法,找到所有内部实体,然后在新模拟的登陆方法中生成这些对象

package com.rainsoft.services.index.action;

import com.rainsoft.common.utils.JSONUtils;
import com.rainsoft.framework.web.struts2.SimpleActionSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class ThirdLoginAction extends SimpleActionSupport { private static final Log logger = LogFactory.getLog(ThirdLoginAction.class); @Resource
private DaoAuthenticationProvider daoAuthenticationProvider;
@Resource
private UserDetailsService userDetailServiceImpl; private SecurityContextImpl securityContextImpl;
/**
*
* 方法功能说明:第三方登陆接口
* @throws IOException
* @date 2017/01/06 10:54:54
*/
public void login() throws Exception {
String userName = request.getParameter("username");
String password = request.getParameter("password");
/*Users user = new Users();
user.setName(userName);
user.setPassword(password);*/ //认证信息,即明文密码,
String credentials = password; //3.Credentials
if(credentials != null){
System.out.println("credentials============");
System.out.println(credentials);
}
// //用户对象 principal============com.rainsoft.framework.entity.Users@a8833b7b
UserDetails principal = userDetailServiceImpl.loadUserByUsername(userName);
if(principal != null){
System.out.println("principal============");
System.out.println(JSONUtils.toJSONString(principal));
}
//用户角色
List<GrantedAuthority> grantedAuthorities =new ArrayList<GrantedAuthority>();
if(grantedAuthorities != null){
GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_USERS");
grantedAuthorities.add(grantedAuthority);
} UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(principal,password,grantedAuthorities);
securityContextImpl = (SecurityContextImpl) SecurityContextHolder.getContext();
securityContextImpl.setAuthentication(usernamePasswordAuthenticationToken); session.put("SPRING_SECURITY_CONTEXT",securityContextImpl); response.sendRedirect(request.getContextPath()+"/main!fmpg.do"); }
}

通过上面的代码,我们就可以直接进入系统B,然后操作相应的菜单,以上只是我的个人理解,如果路过的童鞋们有更好的方法,希望不吝赐教

模拟springmvc 内部登陆,跳过spring filter的更多相关文章

  1. spring filter过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  2. SpringMVC从Controller跳转到另一个Controller(转)

    http://blog.csdn.net/jackpk/article/details/44117603 [PK亲测] 能正常跳转的写法如下: return "forward:aaaa/bb ...

  3. springMVC controller间跳转 重定向 传递参数的方法

    springMVC controller间跳转 重定向 传递参数的方法 spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参 ...

  4. [PHP自动化-进阶]004.Snoopy VS CURL 模拟Discuz.net登陆

    引言:采集论坛第一步就是要模拟登陆,由于各个站点登录表单各不相同,验证方式又是多种多样,所以直接提交用户名密码到登录页面就比较繁琐. 所以我们采用cookie来模拟登陆无疑是最佳捷径. 今天我们要处理 ...

  5. SpringMVC实现客户端跳转

    之前无论是/index跳转到index.jsp 还是/addProduct 跳转到showProduct.jsp,都是服务端跳转. 这一篇练习如何进行客户端跳转 @ 目录 修改IndexControl ...

  6. web应用怎么跳过某些Filter

    在做的项目需要用到cas,而使用cas的话,需要在client的webapp的web.xml中配置好多个filter,但是需要兼容到老的逻辑,如果满足某些条件,就不走cas的filter,满足另外一些 ...

  7. [模拟回调] demo1模拟用字符串调用js函数 demo2模拟springmvc controller回调页面js函数

    demo1. 模拟用字符串调用js 函数 function dataQuery() { var strFun = "testCallBack"; var strParam = &q ...

  8. Spring Filter过滤表单中的非法字符

    使用Spring Filter过滤表单中的非法字符 1 package test.filter; 2 3 import java.io.IOException; 4 import java.util. ...

  9. Ajax登陆,使用Spring Security缓存跳转到登陆前的链接

    Spring Security缓存的应用之登陆后跳转到登录前源地址 什么意思? 用户访问网站,打开了一个链接:(origin url)起源链接 请求发送给服务器,服务器判断用户请求了受保护的资源. 由 ...

随机推荐

  1. Spark RDD Union

    示例   Spark多个RDD(数据格式相同)“组合”为一个RDD   代码   from pyspark import SparkConf, SparkContext conf = SparkCon ...

  2. R语言笔记

    R语言笔记 学习R语言对我来说有好几个地方需要注意的,我觉得这样的经验也适用于学习其他的新的语言. 语言的目标 我理解语言的目标就是这个语言是用来做什么的,为什么样的任务服务的,也就是设计这个语言的动 ...

  3. cryptopp开源库的使用(二):base64加密

    很多时候我只是优秀工具的使用者,优秀的工具用好了才能发挥作用 最近使用cryptopp的base64对压缩后的zip文件内容进行加密遇到了问题. 首先zip压缩没问题,可是最后得到的base64字符串 ...

  4. Struts2学习笔记(二):第一个Struts2应用

    一.创建Action类. 创建工程Struts2Demo struts 2中的Action类并不需要继承struts 2中的某个父类,普遍的java类就可以. 在org.sunny.user.acti ...

  5. jQuery表单验证以及将表单序列化为json对象小练习

    jquery表单验证(非实时验证),同时,将表单序列化为json对象提交表单. <!DOCTYPE html> <html lang="en"> <h ...

  6. STL 常用的一些容器总结

    数据结构 描述 实现头文件 向量(vector) 连续存储的元素 <vector> 列表(list) 由节点组成的双向链表 <list> 双队列(deque) 连续存储的指向不 ...

  7. MaterialEditText

    https://github.com/rengwuxian/MaterialEditText http://www.rengwuxian.com/post/materialedittext

  8. XCode5/Apple LLVM 5.0下使用boost的方法

    Because Apple changes the compiler to llvm only in XCode5, so there are some compatible problems wit ...

  9. (转) [教程] Unity3D中角色的动画脚本的编写(一)

    ps: 这两天研究unity3d,对动画处理特别迷糊,不知FBX导入以后,接下来应该怎么操作,看到这篇文章,感觉非常好,讲解的很详细. 已有好些天没写什么了,今天想起来该写点东西了.这次我所介绍的内容 ...

  10. css改变滚动条样式

    /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 10px; height: 12px; background-color: #F5 ...