SpringSecurity兑现多登录成功页面和登录成功返回被拦截界面
SpringSecurity实现多登录成功页面和登录成功返回被拦截界面
使用SrpingSceurity作为认证和授权的安全框架可以省下很多基础工作.
具体可以参考SpringSecurity,这里不多说了.主要是记录一下使用中碰到的问题.
问题1
项目有不同客户端需要不同的返回界面,比如Android的登录返回json格式数据.网页登录跳转到登录成功页面.
SpringSecurity的默认配置是做不到这点的.以下是配置登录成功页面的地方.
<s:form-login login-page="/login.action" default-target-url="/loginsuccess.jsp" authentication-failure-url="/login.action?error=true" />
这里如果loginsuccess.jsp页面是登录成功页,那么Android的登录就不好返回json格式了.
解决方法
使用AuthenticationSuccessHandler
----------------示例见下----------------
1.定制自己的AuthenticationSuccessHandler类,实现AuthenticationSuccessHandler接口
package com.gt.util; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; public class MyAuthenticationSuccessHandler implements
AuthenticationSuccessHandler { @Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication auth)
throws IOException, ServletException {
String f = request.getParameter("f");
if (StringUtils.isNotEmpty(f)) {
if(f.equals("android")){
response.setCharacterEncoding("UTF-8");
response.getWriter().write("登录成功"+LoginUserUtil.getUser());
} }else{ request.getRequestDispatcher("/account/user.exp").forward(request, response); } } }
2.登录页面中指定f参数.只是示例,可以自己根据业务定制.
3.修改配置文件
增加authentication-success-handler-ref="expaiSuccessHandler"
去掉default-target-url="/loginsuccess.jsp"
<s:form-login login-page="/login.exp" authentication-success-handler-ref="expaiSuccessHandler" authentication-failure-url="/login.exp?error=true" />
官方文档介绍
Attribute : authentication-success-handler-ref
Reference to an AuthenticationSuccessHandler bean which should be used to handle a successful
authentication request. Should not be used in combination with default-target-url (or always-use-
default-target-url) as the implementation should always deal with navigation to the subsequent
destination
4.修改配置文件,增加bean定义
<bean id="expaiSuccessHandler" class="com.gt.util.MyAuthenticationSuccessHandler"></bean>
---------------------------问题1end---------------------
问题2
登录后返回拦截前的界面
思路
在拦截后,进入登录页面前,把被拦截地址放入session中.登录成功从session取出被拦截地址并且跳转.
-------------代码示例-----------
1.增加MyLoginUrlAuthenticationEntryPoint 继承 LoginUrlAuthenticationEntryPoint
package com.gt.util; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.util.RedirectUrlBuilder; public class MyLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException {
String returnUrl = buildHttpReturnUrlForRequest(request);
request.getSession().setAttribute("ru", returnUrl);
super.commence(request, response, authException);
} protected String buildHttpReturnUrlForRequest(HttpServletRequest request)
throws IOException, ServletException { RedirectUrlBuilder urlBuilder = new RedirectUrlBuilder();
urlBuilder.setScheme("http");
urlBuilder.setServerName(request.getServerName());
urlBuilder.setPort(request.getServerPort());
urlBuilder.setContextPath(request.getContextPath());
urlBuilder.setServletPath(request.getServletPath());
urlBuilder.setPathInfo(request.getPathInfo());
urlBuilder.setQuery(request.getQueryString()); return urlBuilder.getUrl();
} }
2.修改配置文件,增加引用
<s:http auto-config="true" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
<bean id="loginUrlAuthenticationEntryPoint" class="com.gt.util.MyLoginUrlAuthenticationEntryPoint">
<property name="useForward" value="true" />
<property name="loginFormUrl" value="/login.exp" />
</bean>
3.修改MyAuthenticationSuccessHandler,增加获取被拦截地址并且跳转代码
package com.gt.util; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication auth)
throws IOException, ServletException {
String f = request.getParameter("f");
if (StringUtils.isNotEmpty(f)) {
if(f.equals("android")){
response.setCharacterEncoding("UTF-8");
response.getWriter().write("登录成功"+LoginUserUtil.getUser());
} }else{
String ru = (String)request.getSession().getAttribute("ru");
request.getSession().removeAttribute("ru");
if(StringUtils.isNotEmpty(ru)){
response.sendRedirect(ru);
//request.getRequestDispatcher(ru).forward(request, response);
}else{
request.getRequestDispatcher("/account/user.exp").forward(request, response);
} } } }
SpringSecurity兑现多登录成功页面和登录成功返回被拦截界面的更多相关文章
- Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面
一.看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url). 请求发送给服务器,服务器判断用户请求了受保护的资源. 由于用户没有登录,服务器重定向到登录页面 填 ...
- 使用session和cookie实现用户登录:一个登录页面,一个servlet,一个登录成功页面
文件目录 1.登录页面 <%@ page language="java" contentType="text/html; charset=utf-8" p ...
- Nodejs:npm run build之后,dist\index.html页面在火狐中可以正常显示登录页面并登录成功,在Chrome中可以正常显示登录页面,登录失败
问题描述:Nodejs:npm run build之后,dist\index.html页面在火狐中可以正常显示登录页面并登录成功,在Chrome中可以正常显示登录页面,登录失败 解决方法:将打包后的d ...
- 微信小程序中h5跳转到登录页面,登陆成功返回携带参数,h5刷新
公司的一个小程序,要做一个活动,需要判断登录状态. 思路:h5跳转到登录页面,登陆成功携带token自动返回. 本来以为是个非常简单的功能,没想到..... 发帖记录一下 1.登录页面 用getCur ...
- asp.net使用session完成: 从哪个页面进入登录页面,登录成功还回到那个页面
1.在Login.aspx页面Load中加入 if (!IsPostBack && Request.UrlReferrer != null) { Session[ " ...
- 使用session页面控制登录入口及购物车效果的实现
由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只 ...
- 【转】【可用】Android 登录判断器,登录成功后帮你准确跳转到目标activity
我们在使用应用时肯定遇到过这样的情景,打开应用,并不是需要我们登录,你可以浏览应用中的大部分页面,但是当你想看某个详情页的时候,点击后突然跳转到了登录页面,好,我们输入账号密码,点击登录,登录成功,跳 ...
- SpringBoot Web开发(5) 开发页面国际化+登录拦截
SpringBoot Web开发(5) 开发页面国际化+登录拦截 一.页面国际化 页面国际化目的:根据浏览器语言设置的信息对页面信息进行切换,或者用户点击链接自行对页面语言信息进行切换. **效果演示 ...
- javaWeb登录注册页面
简单的登陆注册页面 1.配置JDBC驱动连接数据库 2. 配置struts2框架 3. 利用1 2完成登录页面, 注意做到不耦合,即servlet Api和控制器完全脱离) 4. 利用1 2 制作注册 ...
随机推荐
- Flask的使用
一.路由系统 1.子域名的配置 """ 可传入的参数: @app.route('/user/<username>') @app.route('/post/&l ...
- windows下配置 GNU的gdb调试功能
1.配置 修改环境变量(前提电脑中存在gdb.exe) 1. 我的电脑->属性->环境......在path那一项后面添加你DEV-C++ Bin目录的路径(gdb.exe所在目录),如: ...
- Python 中的垃圾回收机制--备忘
GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...
- Python 线程和进程和协程总结
Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...
- Java多线程:Linux多路复用,Java NIO与Netty简述
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: IOCP Free BSD, OS X: kqueue 下面仅讲解L ...
- vscode使用wsl调试代码
第一步在WSL中配好环境 第二步安装CodeRunner即可,在用户配置中加入如下行: "terminal.integrated.shell.windows": "C:\ ...
- python:爬虫入门
直接上代码吧: 一.爬取某外卖平台的指定商家菜品信息 from urllib import request import json import random url = "https:// ...
- python: 序列化/反序列化及对象的深拷贝/浅拷贝
一.序列化/反序列化 python中内置了很多序列化/反序列化的方式,最常用的有json.pickle.marshal这三种,示例用法如下: import json import pickle imp ...
- ldconfig , ldd 与 LD_LIBRARY_PATH 之间的关系
#注意事项 64位的linux机器上的默共享库的查找路径为:/lib64 /usr/lib64.实测发现不会搜索/lib /usr/lib.而且以上的两个目录没有什么so文件./usr/local/l ...
- tensorflow之数据读取探究(2)
tensorflow之tfrecord数据读取 Tensorflow关于TFRecord格式文件的处理.模型的训练的架构为: 1.获取文件列表.创建文件队列:http://blog.csdn.net/ ...