精华内容
下载资源
问答
  • 这个问题是之前在做登录注册模块时遇到的需求,如何用户直接访问登录...实现此功能比较好的方法是用ajax的方式登陆,这样直接在当前页面弹窗让用户登录既可,二是把用户未登录前的url存在session中,login成功之后...

    这个问题是之前在做登录注册模块时遇到的需求,如何用户直接访问登录页面,可以控制直接跳到首页,但是如果是用户没有登录直接访问了购物车等需要经过身份认证的页面,或者是因为session超时,用户需要重新登录,那么这时跳回之前的页面就是提升用户体验的事情。实现此功能比较好的方法是用ajax的方式登陆,这样直接在当前页面弹窗让用户登录既可,二是把用户未登录前的url存在session中,login成功之后先检查session中是否存在这样的一个url。下面通过一段代码给大家分享下:

    项目中集成了shiro,里面就有这么个功能,防止WebUtils工具类里面。

    d399de9395eba8b967d318bf73c3f8a1.pngf49446e22594a982d3d25874ac8e9cbb.png

    废话了这么多,其实网上也有人写过这么一篇关于这个功能实现的的博文,这个大神写的shiro教程也是蛮值得一看的,只不过我在使用

    SavedRequest savedRequest = WebUtils.getSavedRequest(request);的时候,savedRequest 对象一直为空,囧了一段时间,后面再群里遇到高人指点,发现是自己的配置文件没写好,即shiroFilter中的filterChainDefinitions,所需要拦截的url没有写完全,像下面这段配置

    class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" />

    # 无需认证便可以访问的的文件放在前面

    /js/* = anon

    /css/* = anon

    /img/* = anon

    /images/* = anon

    /user-web/login = anon

    /logout = logout

    /user-web/* = authc

    /backend-web/* = authc

    只有/user-web/*  (除去login,这里url的匹配使用短路机制,即最先匹配原则)和/backend-web/ 后面的url,才会被允许存入到session中,这样,当用户没有登陆就去访问包含以上两种链接前缀的时候,登陆成功后就会跳转到之前的界面了。

    以上内容就是本文全部介绍,希望能够帮助到大家

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

    一、看下内部原理

    简化后的认证过程分为7步:

    用户访问网站,打开了一个链接(origin url)。

    请求发送给服务器,服务器判断用户请求了受保护的资源。

    由于用户没有登录,服务器重定向到登录页面

    填写表单,点击登录

    浏览器将用户名密码以表单形式发送给服务器

    服务器验证用户名密码。成功,进入到下一步。否则要求用户重新认证(第三步)

    服务器对用户拥有的权限(角色)判定: 有权限,重定向到origin url; 权限不足,返回状态码403("forbidden").

    从第3步,我们可以知道,用户的请求被中断了。

    用户登录成功后(第7步),会被重定向到origin url,spring security通过使用缓存的request,使得被中断的请求能够继续执行。

    使用缓存

    用户登录成功后,页面重定向到origin url。浏览器发出的请求优先被拦截器RequestCacheAwareFilter拦截,RequestCacheAwareFilter通过其持有的RequestCache对象实现request的恢复。

    public void doFilter(ServletRequest request, ServletResponse response,

    FilterChain chain) throws IOException, ServletException {

    // request匹配,则取出,该操作同时会将缓存的request从session中删除

    HttpServletRequest wrappedSavedRequest = requestCache.getMatchingRequest(

    (HttpServletRequest) request, (HttpServletResponse) response);

    // 优先使用缓存的request

    chain.doFilter(wrappedSavedRequest == null ? request : wrappedSavedRequest,

    response);

    }

    何时缓存

    首先,我们需要了解下RequestCache以及ExceptionTranslationFilter。

    RequestCache

    RequestCache接口声明了缓存与恢复操作。默认实现类是HttpSessionRequestCache。HttpSessionRequestCache的实现比较简单,这里只列出接口的声明:

    public interface RequestCache {

    // 将request缓存到session中

    void saveRequest(HttpServletRequest request, HttpServletResponse response);

    // 从session中取request

    SavedRequest getRequest(HttpServletRequest request, HttpServletResponse response);

    // 获得与当前request匹配的缓存,并将匹配的request从session中删除

    HttpServletRequest getMatchingRequest(HttpServletRequest request,

    HttpServletResponse response);

    // 删除缓存的request

    void removeRequest(HttpServletRequest request, HttpServletResponse response);

    }

    ExceptionTranslationFilter

    ExceptionTranslationFilter 是Spring Security的核心filter之一,用来处理AuthenticationException和AccessDeniedException两种异常。

    在我们的例子中,AuthenticationException指的是未登录状态下访问受保护资源,AccessDeniedException指的是登陆了但是由于权限不足(比如普通用户访问管理员界面)。

    ExceptionTranslationFilter 持有两个处理类,分别是AuthenticationEntryPoint和AccessDeniedHandler。

    ExceptionTranslationFilter 对异常的处理是通过这两个处理类实现的,处理规则很简单:

    规则1. 如果异常是 AuthenticationException,使用 AuthenticationEntryPoint 处理

    规则2. 如果异常是 AccessDeniedException 且用户是匿名用户,使用 AuthenticationEntryPoint 处理

    规则3. 如果异常是 AccessDeniedException 且用户不是匿名用户,如果否则交给 AccessDeniedHandler 处理。

    对应以下代码

    private void handleSpringSecurityException(HttpServletRequest request,

    HttpServletResponse response, FilterChain chain, RuntimeException exception)

    throws IOException, ServletException {

    if (exception instanceof AuthenticationException) {

    logger.debug(

    "Authentication exception occurred; redirecting to authentication entry point",

    exception);

    sendStartAuthentication(request, response, chain,

    (AuthenticationException) exception);

    }

    else if (exception instanceof AccessDeniedException) {

    if (authenticationTrustResolver.isAnonymous(SecurityContextHolder

    .getContext().getAuthentication())) {

    logger.debug(

    "Access is denied (user is anonymous); redirecting to authentication entry point",

    exception);

    sendStartAuthentication(

    request,

    response,

    chain,

    new InsufficientAuthenticationException(

    "Full authentication is required to access this resource"));

    }

    else {

    logger.debug(

    "Access is denied (user is not anonymous); delegating to AccessDeniedHandler",

    exception);

    accessDeniedHandler.handle(request, response,

    (AccessDeniedException) exception);

    }

    }

    }

    AccessDeniedHandler 默认实现是 AccessDeniedHandlerImpl。该类对异常的处理是返回403错误码。

    public void handle(HttpServletRequest request, HttpServletResponse response,

    AccessDeniedException accessDeniedException) throws IOException,

    ServletException {

    if (!response.isCommitted()) {

    if (errorPage != null) {  // 定义了errorPage

    // errorPage中可以操作该异常

    request.setAttribute(WebAttributes.ACCESS_DENIED_403,

    accessDeniedException);

    // 设置403状态码

    response.setStatus(HttpServletResponse.SC_FORBIDDEN);

    // 转发到errorPage

    RequestDispatcher dispatcher = request.getRequestDispatcher(errorPage);

    dispatcher.forward(request, response);

    }

    else { // 没有定义errorPage,则返回403状态码(Forbidden),以及错误信息

    response.sendError(HttpServletResponse.SC_FORBIDDEN,

    accessDeniedException.getMessage());

    }

    }

    }

    AuthenticationEntryPoint 默认实现是 LoginUrlAuthenticationEntryPoint, 该类的处理是转发或重定向到登录页面

    public void commence(HttpServletRequest request, HttpServletResponse response,

    AuthenticationException authException) throws IOException, ServletException {

    String redirectUrl = null;

    if (useForward) {

    if (forceHttps && "http".equals(request.getScheme())) {

    // First redirect the current request to HTTPS.

    // When that request is received, the forward to the login page will be

    // used.

    redirectUrl = buildHttpsRedirectUrlForRequest(request);

    }

    if (redirectUrl == null) {

    String loginForm = determineUrlToUseForThisRequest(request, response,

    authException);

    if (logger.isDebugEnabled()) {

    logger.debug("Server side forward to: " + loginForm);

    }

    RequestDispatcher dispatcher = request.getRequestDispatcher(loginForm);

    // 转发

    dispatcher.forward(request, response);

    return;

    }

    }

    else {

    // redirect to login page. Use https if forceHttps true

    redirectUrl = buildRedirectUrlToLoginPage(request, response, authException);

    }

    // 重定向

    redirectStrategy.sendRedirect(request, response, redirectUrl);

    }

    了解完这些,回到我们的例子。

    第3步时,用户未登录的情况下访问受保护资源,ExceptionTranslationFilter会捕获到AuthenticationException异常(规则1)。页面需要跳转,ExceptionTranslationFilter在跳转前使用requestCache缓存request。

    protected void sendStartAuthentication(HttpServletRequest request,

    HttpServletResponse response, FilterChain chain,

    AuthenticationException reason) throws ServletException, IOException {

    // SEC-112: Clear the SecurityContextHolder's Authentication, as the

    // existing Authentication is no longer considered valid

    SecurityContextHolder.getContext().setAuthentication(null);

    // 缓存 request

    requestCache.saveRequest(request, response);

    logger.debug("Calling Authentication entry point.");

    authenticationEntryPoint.commence(request, response, reason);

    }

    二、了解了以上原理以及上篇的forward和redirect的区别,配置实现如下,基于springsecurity4.1.3版本

    配置文件:完整的

    xmlns:beans="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.xsd

    http://www.springframework.org/schema/security

    http://www.springframework.org/schema/security/spring-security.xsd">

    login-page="/login"

    authentication-failure-url="/login?error"

    login-processing-url="/login"

    authentication-success-handler-ref="myAuthenticationSuccessHandler" />

    logout-success-url="/"

    invalidate-session="true"

    delete-cookies="JSESSIONID"/>

    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">

    主要配置

    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">

    从上面的分析可知,默认情况下采用的是redirect方式,这里通过配置从而实现了forward方式,这里还是直接利用的security自带的类LoginUrlAuthenticationEntryPoint,只不过进行了以上配置:

    /**

    * Performs the redirect (or forward) to the login form URL.

    */

    public void commence(HttpServletRequest request, HttpServletResponse response,

    AuthenticationException authException) throws IOException, ServletException {

    String redirectUrl = null;

    if (useForward) {

    if (forceHttps && "http".equals(request.getScheme())) {

    // First redirect the current request to HTTPS.

    // When that request is received, the forward to the login page will be

    // used.

    redirectUrl = buildHttpsRedirectUrlForRequest(request);

    }

    if (redirectUrl == null) {

    String loginForm = determineUrlToUseForThisRequest(request, response,

    authException);

    if (logger.isDebugEnabled()) {

    logger.debug("Server side forward to: " + loginForm);

    }

    RequestDispatcher dispatcher = request.getRequestDispatcher(loginForm);

    dispatcher.forward(request, response);

    return;

    }

    }

    else {

    // redirect to login page. Use https if forceHttps true

    redirectUrl = buildRedirectUrlToLoginPage(request, response, authException);

    }

    redirectStrategy.sendRedirect(request, response, redirectUrl);

    }

    登录成功后的类配置,存入登录user信息后交给认证成功后的处理类MyAuthenticationSuccessHandler,该类集成了SavedRequestAwareAuthenticationSuccessHandler,他会从缓存中提取请求,从而可以恢复之前请求的数据

    /**

    * 登录后操作

    *

    * @author HHL

    * @date

    *

    */

    @Component

    public class MyAuthenticationSuccessHandler extends

    SavedRequestAwareAuthenticationSuccessHandler {

    @Autowired

    private IUserService userService;

    @Override

    public void onAuthenticationSuccess(HttpServletRequest request,

    HttpServletResponse response, Authentication authentication)

    throws IOException, ServletException {

    // 认证成功后,获取用户信息并添加到session中

    UserDetails userDetails = (UserDetails) authentication.getPrincipal();

    MangoUser user = userService.getUserByName(userDetails.getUsername());

    request.getSession().setAttribute("user", user);

    super.onAuthenticationSuccess(request, response, authentication);

    }

    }

    SavedRequestAwareAuthenticationSuccessHandler中的onAuthenticationSuccess方法;

    @Override

    public void onAuthenticationSuccess(HttpServletRequest request,

    HttpServletResponse response, Authentication authentication)

    throws ServletException, IOException {

    SavedRequest savedRequest = requestCache.getRequest(request, response);

    if (savedRequest == null) {

    super.onAuthenticationSuccess(request, response, authentication);

    return;

    }

    String targetUrlParameter = getTargetUrlParameter();

    if (isAlwaysUseDefaultTargetUrl()

    || (targetUrlParameter != null && StringUtils.hasText(request

    .getParameter(targetUrlParameter)))) {

    requestCache.removeRequest(request, response);

    super.onAuthenticationSuccess(request, response, authentication);

    return;

    }

    clearAuthenticationAttributes(request);

    // Use the DefaultSavedRequest URL

    String targetUrl = savedRequest.getRedirectUrl();

    logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl);

    getRedirectStrategy().sendRedirect(request, response, targetUrl);

    }

    4.1.3中如果默认不配置的话也是采用的SavedRequestAwareAuthenticationSuccessHandler进行处理,详情可参见:Spring实战篇系列----源码解析Spring Security中的过滤器Filter初始化

    上述实现了跳转到登录界面采用forward方式,就是浏览器地址栏没有变化,当然也可采用redirect方式,地址栏变为登录界面地址栏,当登录完成后恢复到原先的请求页面,请求信息会从requestCache中还原回来。可参考 Spring实战篇系列----spring security4.1.3配置以及踩过的坑

    参考:

    https://segmentfault.com/a/1190000004183264

    http://gtbald.iteye.com/blog/1214132

    展开全文
  • 登陆后,handle不变,定位登陆成功后跳转页面元素定位不到,提示:org.openqa.selenium.NoSuchElementException: Unable to locate element//点击登陆driver.findElement(By.xpath("//*[@id='loginSubmit']"))....

    登陆后,handle不变,定位登陆成功后跳转的页面元素定位不到,提示:org.openqa.selenium.NoSuchElementException: Unable to locate element

    //点击登陆

    driver.findElement(By.xpath("//*[@id='loginSubmit']")).click();

    String currentWindow = driver.getWindowHandle();//获取当前窗口句柄

    //等待页面加载完成

    WebDriverWait wait = new WebDriverWait(driver, 70);

    wait.until(new ExpectedCondition() {

    public Boolean apply(WebDriver d){

    boolean loadcomplete = d.switchTo().frame("right_frame").findElement(By.xpath("//center/div[@class='welco']/img")).isDisplayed();

    return loadcomplete;

    }

    });

    //定位跳转后页面上一个关闭按钮 元素

    driver.findElement(By.xpath("//*[@id='closeX']/div/a")).click();

    System.out.println("关闭宣传窗口");

    展开全文
  • 只登陆服务端测试,登录成功后能够跳转登录页面,再次使用另一组用户,提交成功。 3.从服务器登录 ,重新打开窗口并访问客户端地址,客户端跳转成功,在原来服务端窗口切换用户登录,提交 不能提交成功。如下图所...
  • 正常来说,用户登录之后跳转home页,如果发现没有登录成功再跳回登录页,初次使用shiro框架,不知道哪里配置错误了,现在遇到的情况是抛错+跳回登录页 org.apache.shiro.authc.AuthenticationException at ...
  • %>My JSP 'login.jsp' starting page --%> 欢迎您XXX,登录成功! --%> login_failure.jsp String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+...

    代码如下:

    login.jsp

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    %>

    My JSP 'login.jsp' starting page

    用户名:

    密码:

    dologin.jsp

    page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    String username="";

    String password="";

    request.setCharacterEncoding("utf-8");

    username=request.getParameter("username");

    password=request.getParameter("password");

    //username=request.getAttribute("username").toString();

    //password=request.getAttribute("password").toString();

    //如果用户名和密码都等于admin,则登录成功

    if("abc".equals(username)&&"12345".equals(password))

    {

    request.getRequestDispatcher("login_success.jsp").forward(request,response);

    }

    else

    {

    response.sendRedirect("login_failure.jsp");

    }

    %>

    login_success.jsp

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    %>

    My JSP 'login.jsp' starting page

    --%>

    欢迎您XXX,登录成功!

    --%>

    login_failure.jsp

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    %>

    My JSP 'login.jsp' starting page

    登录失败!请检查用户名或者密码!

    返回登录

    展开全文
  • JavaWeb登陆成功后跳转到上一个页面,这个标题注定要词不达意,你可能会遇到这样的情形,当点击页面的某个请求时,由于用户未登录,需要跳转到登录页,用户登录成功后,再跳转到上一个页面;还有一种情况,多个页面...
  • %>My JSP 'login.jsp' starting page --%> 欢迎您XXX,登录成功! --%> login_failure.jsp String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+...
  • Java开发Android入门学习——AndroidStudio在Activity实现简单登录功能,跳转页面显示登录用户名 安装AS: AndroidStudio安装,在安装好AS之后,配置好相对应的SDK,AVD,成功后进行下一步。 创建项目: 这次...
  • 如何使用Shiro实现不同用户登录成功后跳转到不同主页?10 Shiro配置文件中successUrl指定的页面只有一个:  Java代码  "shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean...
  • 在某网站的登录页面登录时如果选择“记住用户名”,登录成功后跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“不记住...
  • 使用Java访问一般网页,进行数据抓取等比较简单,直接用URL和URLConnection连接所需要的...另外,即使先在登录页面进行了登录,然后再转到要登录才能访问的网页时,如果没在第二次连接中加入之前登录成功后的sess...
  • 从首页A进入页面B,然后从B页面登录,成功后跳转到A页面,并打印一句话“登录成功”,传值需要用的后台的。 在B页面写: <% session.setAttribute("key", "success"); %> ...
  • 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您;登录失败跳转到FailServlet展示:登录失败,用户名或密码错误。我们这里使用了以下技术:使用Druid数据库连接池技术,操作mysql,使用spring的...
  • 跳转登录页面前将当前页面url记录下来,比如放入session的一个变量"url",登录验证成功后判断session中的url是否有值,如果有跳转至此页面,如果没有,跳转主页 java 登录之后 如何放回 到原来的页面位置
  • 如果没有登录重定向到登录页面3手工在登录页面录入正确的账户信息并提交4服务器判断登录信息是否正确,如果正确则将登录成功信息保存到session中5登录成功后服务器端给浏览器返回会话的sessionid信息保存到客户端的...
  • 如果没有登录重定向到登录页面3手工在登录页面录入正确的账户信息并提交4服务器判断登录信息是否正确,如果正确则将登录成功信息保存到session中5登录成功后服务器端给浏览器返回会话的SessionID信息保存到客户端的...
  • ()" value="发布"> ``` function submitForm1() { /* var id = document.getElementById("userId").value;...现在拦截器好使了-但是点完发布页面跳转了-但是数据库能存上-不知道怎么回事-新手-求解答
  • session做登录存储认证,电脑连接了手机wifi,PC端登录系统,localhost访问项目地址,登录成功,登录信息成功存入session里,可是在登录后页面跳转,做登录验证的时候获取session的时候就为空了。 进过调试,最后...
  • jsp页面自动跳转

    2013-12-28 10:44:05
    success.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> Login Success Page ... 登录成功,跳转中... ...其中,2表示2秒后跳转,url为跳转的目标页面
  • 登录页面点击注册跳转到如下注册页面,该页面可完成注册功能 如果要注册的用户名已存在,则在下方显示提示,如图: 如果用户名不存在,则提示注册成功,如图: 点击返回,可回到登录界面 UI界面设计如下: ...
  • 很多人在写登录的时候会遇到一个问题,那就是登录成功后跳转到当前页。其实原理很简单,在登录的form中,我们给一个隐藏的input,这个input保存的是当前页的url,并且提交表单的时候把这个值也给后台传过去。java的...
  • 学习了Java 中的过滤器,了解到过滤器执行的三个步骤: 1:可以每次在浏览器访问服务器的时候提前进行一次预处理 2:调用下一个过滤器或者网页 3:离开目标资源/响应再进行一次处理。 问题出现: 我的项目...
  • 3、创建一个用户表user和用户类型表userType(项目中的角色和权限问题)user:id,act,pwd,tiduserType:tid,tname创建登录页面login.jsp,登录成功后将act和tid保存在session中登录成功后跳转到manage.jsp页面页面中有...
  • 当第一次去购物的时候,打开宝贝后,选好尺码等属性,点击购买,会弹出一个登录窗口,假设我没有用户账户,去注册一个,经过三个步骤后(填写用户名->验证邮箱等->注册成功),注册成功后,它跳回了付款页面。...
  • 成功开发者帐号登录公众号后台,点击【开发–接口权限】,找到如下菜单 选择修改 网页授权。在弹出的授权页面,按页面提示进行配置: 3.设置自定义菜单 如果你是按微信官网开发文档进行操作的话,恭喜你,...
  • 项目介绍购物车系统主要模拟用户购买商品,实现用户注册、登录、添加商品至购物车、结算、生成订单等功能,并辅助添加管理员对商品进行管理的功能。...注册成功直接跳转至登录界面,登录成功后则显示商品列表界面...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

java登录成功后跳转页面

java 订阅