`

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_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 是一个强大且易用的 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 等认证令牌类...

    Apache Shiro中文开发文档.pdf

    - **环境准备**:需要Java 1.5及以上版本,推荐使用Apache Maven作为构建工具,但也可以手动集成Shiro的JAR包。 - **示例项目**:提供了两种获取示例项目的方式: - **版本控制库**:...

Global site tag (gtag.js) - Google Analytics