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兑现多登录成功页面和登录成功返回被拦截界面的更多相关文章

  1. Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面

    一.看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url). 请求发送给服务器,服务器判断用户请求了受保护的资源. 由于用户没有登录,服务器重定向到登录页面 填 ...

  2. 使用session和cookie实现用户登录:一个登录页面,一个servlet,一个登录成功页面

    文件目录 1.登录页面 <%@ page language="java" contentType="text/html; charset=utf-8" p ...

  3. Nodejs:npm run build之后,dist\index.html页面在火狐中可以正常显示登录页面并登录成功,在Chrome中可以正常显示登录页面,登录失败

    问题描述:Nodejs:npm run build之后,dist\index.html页面在火狐中可以正常显示登录页面并登录成功,在Chrome中可以正常显示登录页面,登录失败 解决方法:将打包后的d ...

  4. 微信小程序中h5跳转到登录页面,登陆成功返回携带参数,h5刷新

    公司的一个小程序,要做一个活动,需要判断登录状态. 思路:h5跳转到登录页面,登陆成功携带token自动返回. 本来以为是个非常简单的功能,没想到..... 发帖记录一下 1.登录页面 用getCur ...

  5. asp.net使用session完成: 从哪个页面进入登录页面,登录成功还回到那个页面

    1.在Login.aspx页面Load中加入 if (!IsPostBack && Request.UrlReferrer != null) {      Session[ " ...

  6. 使用session页面控制登录入口及购物车效果的实现

          由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只 ...

  7. 【转】【可用】Android 登录判断器,登录成功后帮你准确跳转到目标activity

    我们在使用应用时肯定遇到过这样的情景,打开应用,并不是需要我们登录,你可以浏览应用中的大部分页面,但是当你想看某个详情页的时候,点击后突然跳转到了登录页面,好,我们输入账号密码,点击登录,登录成功,跳 ...

  8. SpringBoot Web开发(5) 开发页面国际化+登录拦截

    SpringBoot Web开发(5) 开发页面国际化+登录拦截 一.页面国际化 页面国际化目的:根据浏览器语言设置的信息对页面信息进行切换,或者用户点击链接自行对页面语言信息进行切换. **效果演示 ...

  9. javaWeb登录注册页面

    简单的登陆注册页面 1.配置JDBC驱动连接数据库 2. 配置struts2框架 3. 利用1 2完成登录页面, 注意做到不耦合,即servlet Api和控制器完全脱离) 4. 利用1 2 制作注册 ...

随机推荐

  1. Flask的使用

    一.路由系统 1.子域名的配置 """ 可传入的参数: @app.route('/user/<username>') @app.route('/post/&l ...

  2. windows下配置 GNU的gdb调试功能

    1.配置 修改环境变量(前提电脑中存在gdb.exe) 1. 我的电脑->属性->环境......在path那一项后面添加你DEV-C++ Bin目录的路径(gdb.exe所在目录),如: ...

  3. Python 中的垃圾回收机制--备忘

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

  4. Python 线程和进程和协程总结

    Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...

  5. Java多线程:Linux多路复用,Java NIO与Netty简述

    JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: IOCP Free BSD, OS X: kqueue 下面仅讲解L ...

  6. vscode使用wsl调试代码

    第一步在WSL中配好环境 第二步安装CodeRunner即可,在用户配置中加入如下行: "terminal.integrated.shell.windows": "C:\ ...

  7. python:爬虫入门

    直接上代码吧: 一.爬取某外卖平台的指定商家菜品信息 from urllib import request import json import random url = "https:// ...

  8. python: 序列化/反序列化及对象的深拷贝/浅拷贝

    一.序列化/反序列化 python中内置了很多序列化/反序列化的方式,最常用的有json.pickle.marshal这三种,示例用法如下: import json import pickle imp ...

  9. ldconfig , ldd 与 LD_LIBRARY_PATH 之间的关系

    #注意事项 64位的linux机器上的默共享库的查找路径为:/lib64 /usr/lib64.实测发现不会搜索/lib /usr/lib.而且以上的两个目录没有什么so文件./usr/local/l ...

  10. tensorflow之数据读取探究(2)

    tensorflow之tfrecord数据读取 Tensorflow关于TFRecord格式文件的处理.模型的训练的架构为: 1.获取文件列表.创建文件队列:http://blog.csdn.net/ ...