3ddc0e0b8b8b0a326cc4cf17d6b68fd63c98b016.svn-base 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package org.jeecg.config.shiro.filters;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  4. import org.apache.shiro.web.filter.InvalidRequestFilter;
  5. import org.apache.shiro.web.filter.mgt.DefaultFilter;
  6. import org.apache.shiro.web.filter.mgt.FilterChainManager;
  7. import org.apache.shiro.web.filter.mgt.FilterChainResolver;
  8. import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
  9. import org.apache.shiro.web.mgt.WebSecurityManager;
  10. import org.apache.shiro.web.servlet.AbstractShiroFilter;
  11. import org.apache.shiro.mgt.SecurityManager;
  12. import org.springframework.beans.factory.BeanInitializationException;
  13. import javax.servlet.Filter;
  14. import java.util.Map;
  15. /**
  16. * 自定义ShiroFilterFactoryBean解决资源中文路径问题
  17. */
  18. @Slf4j
  19. public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean {
  20. @Override
  21. public Class getObjectType() {
  22. return MySpringShiroFilter.class;
  23. }
  24. @Override
  25. protected AbstractShiroFilter createInstance() throws Exception {
  26. SecurityManager securityManager = getSecurityManager();
  27. if (securityManager == null) {
  28. String msg = "SecurityManager property must be set.";
  29. throw new BeanInitializationException(msg);
  30. }
  31. if (!(securityManager instanceof WebSecurityManager)) {
  32. String msg = "The security manager does not implement the WebSecurityManager interface.";
  33. throw new BeanInitializationException(msg);
  34. }
  35. FilterChainManager manager = createFilterChainManager();
  36. //Expose the constructed FilterChainManager by first wrapping it in a
  37. // FilterChainResolver implementation. The AbstractShiroFilter implementations
  38. // do not know about FilterChainManagers - only resolvers:
  39. PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
  40. chainResolver.setFilterChainManager(manager);
  41. Map<String, Filter> filterMap = manager.getFilters();
  42. Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());
  43. if (invalidRequestFilter instanceof InvalidRequestFilter) {
  44. //此处是关键,设置false跳过URL携带中文400,servletPath中文校验bug
  45. ((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);
  46. }
  47. //Now create a concrete ShiroFilter instance and apply the acquired SecurityManager and built
  48. //FilterChainResolver. It doesn't matter that the instance is an anonymous inner class
  49. //here - we're just using it because it is a concrete AbstractShiroFilter instance that accepts
  50. //injection of the SecurityManager and FilterChainResolver:
  51. return new MySpringShiroFilter((WebSecurityManager) securityManager, chainResolver);
  52. }
  53. private static final class MySpringShiroFilter extends AbstractShiroFilter {
  54. protected MySpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver) {
  55. if (webSecurityManager == null) {
  56. throw new IllegalArgumentException("WebSecurityManager property cannot be null.");
  57. } else {
  58. this.setSecurityManager(webSecurityManager);
  59. if (resolver != null) {
  60. this.setFilterChainResolver(resolver);
  61. }
  62. }
  63. }
  64. }
  65. }