Shiro去掉登录时url里的JSESSIONID,允许分号 中文参数

本文介绍了Shiro 1.8升级后如何配置以允许中文参数和分号,同时移除登录URL中的JSESSIONID,以及解决HTTPS跳转问题的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shiro升级1.8之后默认不允许中文参数,以及分号(;)参数,导致系统首次打开时,因带有;JSESSIONID=参数,系统出现400错误页面。

配置允许;号参数后即可解决,如果想要去掉JSESSIONID参数,可按如下方式处理

一、去掉登录时url里面的JSESSIONID参数

    @Bean
    @ConditionalOnMissingBean
    public DefaultWebSessionManager sessionManager(ShiroProp shiroProp) {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        // 去掉shiro登录时url里的JSESSIONID
        sessionManager.setSessionIdUrlRewritingEnabled(false);
        return sessionManager;
    }
    
    @Bean
    @ConditionalOnMissingBean
    public org.apache.shiro.mgt.SecurityManager securityManager(EhCacheManager cacheManager,
                                                                RememberMeManager rememberMeManager, AbstractShiroDbRealm shiroDbRealm,
                                                                SessionManager sessionManager, ShiroProp shiroProp) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 设置realm.
        securityManager.setRealm(shiroDbRealm);
        securityManager.setCacheManager(cacheManager);
        securityManager.setRememberMeManager(rememberMeManager);
        // 设置sessionManager,去掉shiro登录时url里的JSESSIONID
        securityManager.setSessionManager(sessionManager);
        return securityManager;
    }

二、允许分号/中文参数

重写invalidRequest过滤器,允许;号参数以及中文参数

1)定义InvalidRequestFilter bean对象
2)配置shiroFilter对象,重新配置invalidRequest过滤器

    private InvalidRequestFilter invalidRequestFilter(){
        InvalidRequestFilter invalidRequestFilter = new InvalidRequestFilter();
        //允许中文参数地址
        invalidRequestFilter.setBlockNonAscii(false);
        //允许地址带分号;
        invalidRequestFilter.setBlockSemicolon(false);
        return invalidRequestFilter;
    }
    
    @ConditionalOnMissingBean
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager, Section section) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        // 必须设置 SecurityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 登录成功后要跳转的链接
        shiroFilterFactoryBean.setSuccessUrl("/index");
        // 未授权界面;
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

        // 拦截器.
        shiroFilterFactoryBean.setFilterChainDefinitionMap(section);
        Map<String, Filter> filters = new HashMap<>();
        // 配置 invalidRequestFilter
        filters.put("invalidRequest", invalidRequestFilter());
        shiroFilterFactoryBean.setFilters(filters);
        logger.info("Shiro拦截器工厂类注入成功");
        return shiroFilterFactoryBean;
    }

三、配置https,跳转后变成http

这个问题我试了很久,只有以下方法能解决

1)重写过滤器
2)配置nginx,http请求强制转发到https

1、重写过滤器

public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
	
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
		if (isLoginRequest(request, response)) {
			if (isLoginSubmission(request, response)) {
				return executeLogin(request, response);
			} else {
				//allow them to see the login page ;)
				return true;
			}
		} else {
			saveRequestAndRedirectToLogin(request, response);
			return false;
		}
	}
	// 配置https,跳转后变成http --start
	protected void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
		saveRequest(request);
		redirectToLogin(request, response);
	}

	protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
		String loginUrl = getLoginUrl();
		WebUtils.issueRedirect(request, response, loginUrl, null, true, false);
	}
	// 配置https,跳转后变成http --end
}

2、nginx配置,http请求强制转发到https

proxy_redirect http:// $scheme://;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顽石九变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值