`

shiro使用apache代理时,自动加上项目名称

 
阅读更多

有一个项目使用了shiro认证和授权,当该项目使用apache的VirtualHost反向代理时,出现了一个问题,

如下,是apache的配置

 

<VirtualHost *:80>
	
	ServerName xxx.xxx.cn
	ProxyPass  / http://192.168.1.8:8088/projectName/
	ProxyPassReverse / http://192.168.1.8:8088/projectName/
	ProxyPassReverseCookiePath /projectName /
	
	
</VirtualHost>

 

 

当我们输入xxx.xxx.cn 如果使我们没登录过项目,应该是跳转到登录页面也就是xxx.xxx.cn/login 的url

但是现在会自动给我们加上项目名变成了xxx.xxx.cn/projectName/login的url

 

原因是我们使用了shiro,shiro给我们加上了项目的名称。

 

解决方法

修改apache的配置加上header

<VirtualHost *:80>
	
	ServerName xxx.xxx.cn
	ProxyPass  / http://192.168.1.8:8088/projectName/
	ProxyPassReverse / http://192.168.1.8:8088/projectName/
	ProxyPassReverseCookiePath /projectName /
	RequestHeader append myHeader "aaabbb"
	
</VirtualHost>

 

 

 然后在我们的项目中写一个filter 继承shiro的FormAuthenticationFilter,这个是认证的filter,

然后我们取出header值,如果是我们设置的,则我们就把项目名去掉

 

package com.qs.catering.admin.filter;

import java.io.IOException;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;

public class CustomFormAuthenticationFilter  extends FormAuthenticationFilter{

	@Override
	protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
		HttpServletRequest req = (HttpServletRequest) request;
		String loginUrl = getLoginUrl();
		if("aaabbb".equals(req.getHeader("myHeader"))){
//此处的第5个参数,就是把项目名称去掉
			WebUtils.issueRedirect(request, response, loginUrl, null, false, true);
		}else{
			WebUtils.issueRedirect(request, response, loginUrl);
		}
	}

	

}

 

 

同样在写一个退出filger,集成 LogoutFilter,和认证的filter同理

 

package com.qs.catering.admin.filter;

import java.util.Locale;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.apache.shiro.session.SessionException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.apache.shiro.web.util.WebUtils;

public class CustomLogoutFilter extends LogoutFilter {
	private static Logger log = Logger.getLogger(CustomLogoutFilter.class);
	@Override
	protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {

		Subject subject = getSubject(request, response);

        // Check if POST only logout is enabled
        if (isPostOnlyLogout()) {

            // check if the current request's method is a POST, if not redirect
            if (!WebUtils.toHttp(request).getMethod().toUpperCase(Locale.ENGLISH).equals("POST")) {
               return onLogoutRequestNotAPost(request, response);
            }
        }

        String redirectUrl = getRedirectUrl(request, response, subject);
        //try/catch added for SHIRO-298:
        try {
            subject.logout();
        } catch (SessionException ise) {
            log.debug("Encountered session exception during logout.  This can generally safely be ignored.", ise);
        }
        HttpServletRequest req = (HttpServletRequest) request;
        if("aaabbb".equals(req.getHeader("myHeader"))){
        	WebUtils.issueRedirect(request, response, redirectUrl, null, false, true);
        }else{
        	issueRedirect(request, response, redirectUrl);
        }
        return false;
	}

}

 

 

我们的shirioconfig 中加入下代码

 

Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
        // 将自定义的FormAuthenticationFilter注入shiroFilter中
        filters.put("authc", new CustomFormAuthenticationFilter());
        // 将自定义的LogoutFilter注入shiroFilter中
        filters.put("logout", new CustomLogoutFilter());

 

 

就是下图中



 

 

 

这样就解决了我们的问题

 

 

 

 

 

 

 

 

 

 

  • 大小: 49.1 KB
分享到:
评论

相关推荐

    Apache Shiro教程

    - **RememberMe**:允许用户在下次访问时自动登录。 - **Web支持**:Shiro可以方便地与Servlet容器集成,提供过滤器实现Web安全控制。 - **Caching**:支持缓存机制,减少对数据源的频繁访问,提高性能。 - **...

    Apache_Shiro_使用手册(一)Shiro架构介绍

    ### Apache Shiro 使用手册(一)Shiro架构介绍 #### 一、Shiro简介 Apache Shiro 是一款功能强大且易于使用的 Java 安全框架,它提供了多种安全相关的功能和服务,包括但不限于认证、授权、加密和会话管理。相较...

    权限管理Shiro系统-Apache开源顶级项目shiro-SpringMVC_Shiro项目

    权限管理Shiro系统-Apache开源顶级项目shiro-SpringMVC_Shiro项目

    Apache Shiro API(Apache Shiro开发文档).CHM

    Apache Shiro。 官网 Apache Shiro API。 Apache Shiro开发文档。

    Apache shiro 1.13.0源码

    总之,Apache Shiro 1.13.0 源码提供了深入了解 Java 安全框架的机会,无论是对于学习安全基础知识,还是解决实际项目中的安全问题,都是非常宝贵的资源。通过深入阅读和实践,开发者可以提升自身的安全编程能力,为...

    Apache Shiro中文版使用手册

    ### Apache Shiro 使用手册知识点详解 #### 一、Apache Shiro 概述 **1.1 什么是 Apache Shiro** Apache Shiro 是一款强大的 Java 安全框架,它集成了认证、授权、加密和会话管理等功能。这些功能使得 Shiro 成为...

    整合Apache Oltu 与 Shiro. 提供一个轻量的OAUTH2应用框架

    Apache Oltu和Apache Shiro都是在IT领域中广泛使用的开源项目,它们分别专注于身份验证、授权和OAuth2协议的实现。将这两个组件整合在一起,可以构建出一个强大的、轻量级的安全应用框架,适用于各种应用场景,包括...

    Apache_Shiro_使用手册

    总的来说,Apache Shiro 是一个全面且易于上手的 Java 安全框架,适用于各种类型的项目。通过理解它的核心概念和组件,开发者可以快速搭建起一个健壮的安全体系,确保应用程序的数据安全和访问控制。

    Apache_Shiro_使用手册.docx

    Apache Shiro 是一个轻量级的 Java 安全框架,主要负责处理认证、授权、加密和会话管理等核心安全任务。它的设计简洁且易于使用,使得开发人员能够快速集成安全功能到各种类型的应用程序中。 Shiro 的核心组件包括 ...

    shiro使用的jar包

    "shiro使用的jar包"指的是在Java项目中集成Shiro所需的库文件。 在描述中提到的"java项目使用shiro开发所使用的jar包都在里面",这暗示了压缩包可能包含了Shiro框架的所有必需组件。通常,这些jar包包括: 1. **...

    Apache_Shiro参考手册中文版.zip

    Apache Shiro 的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。框架应 该尽可能掩盖复杂的地方,露出一个干净而直观的 API,来简化开发人员在使他们的应用程序安全上的努力。 ...

    Apache_Shiro_reference 使用文档(中文版) 共92页.pdf

    在使用Shiro时,你需要有一个基础的Java环境(Java 1.5及以上版本),并且虽然Shiro推荐使用Apache Maven作为构建工具,但构建方式可以灵活选择,例如使用Apache Ant和Ivy也是可行的。 为了快速入门,可以参考...

    shiro, Apache镜像.zip

    shiro, Apache镜像 Apache是一个强大的。的Java安全框架,它执行认证。授权。加密和会话管理。 借助 shiro,你可以快速轻松地将任何应用程序从小型移动应用程序secure到大型网络和企业应用程序。文档和示例http://sh

    apache shiro maven包

    Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权。在本文中,了解 Apache Shiro 并通过示例来在一个 Groovy web 应用程序中尝试使用 Shiro 进行身份验证和授权

    【Shiro】Apache Shiro架构之实际运用(整合到Spring中

    ### Apache Shiro 架构之实际运用(整合到Spring中) #### 一、Apache Shiro 简介 Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证(Authentication)、授权(Authorization)、加密(Cryptography)和会话...

    shiro最简单整合版本

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密和会话管理功能,简化了处理安全性的工作。在本文中,我们将深入探讨 Apache Shiro 的核心概念及其最简单的整合方式。 一、Shiro 的核心...

    apache shiro 实例

    Apache Shiro 是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。本实例将深入探讨 Apache Shiro 的核心概念和常见用法。 1. **认证**:Shiro 提供了用户身份...

    Apache Shiro使用手册 共22页.pdf

    Apache Shiro 使用手册 Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能。Shiro 的架构主要包括三个核心组件:Subject、SecurityManager 和 Realm。 1. 认证...

    Apache shiro权限控制基础配置代码

    当用户尝试访问受保护资源时,Shiro会自动触发认证过程。 **4. 授权(Authorization)** Shiro的授权机制允许你定义角色(Role)和权限(Permission)。在 Realm 的 `doGetAuthorizationInfo` 方法中,你需要根据...

    Apache Shiro 使用分享

    在本文中,我们将深入探讨Apache Shiro的核心概念、主要功能以及如何在实际项目中进行使用。 1. **核心概念** - **认证**:验证用户身份的过程,即确认用户是谁。Shiro 提供了 UsernamePasswordToken 等认证令牌类...

Global site tag (gtag.js) - Google Analytics