我有使用java配置方法配置Spring安全性的Spring Web应用程序.我想从身份验证中排除一些URL模式(例如:静态资源等).我之前使用spring security xml config做了这个,但是无法弄清楚java配置,因为添加antmatchers没有帮助.
以下是我在扩展WebSecurityConfigurerAdapter的安全配置类中添加的代码
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/authFailure")
.permitAll()
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.authenticationProvider(_provider)
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(authFilter())
.addFilterAfter(executionContextFilter(),
TokenBasedSecurityFilter.class).csrf().disable();
}
Run Code Online (Sandbox Code Playgroud)
我使用的弹簧安全版本是3.2.0.在此先感谢您的帮助
编辑:
我在点击排除的网址时得到的堆栈跟踪,
org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request
at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) …
Run Code Online (Sandbox Code Playgroud) 我想知道什么是释放文件资源/句柄的最佳/适当方式.
传统代码,
BufferredInputStream stream = null
try{
----
stream = new BufferredInputStream(new FileInputStream());
----
} finally{
if(stream != null){
stream.close()
}
Run Code Online (Sandbox Code Playgroud)
}
通过BufferredInputStream.close
单独关闭来释放文件句柄,还是需要stream(i.e. FileInputStream.close())
显式调用底层文件句柄.
P.S. Javadoc for [FilterOutputStream.close]
method指定它也将显式关闭基础流.但其他流似乎在文档中没有这个.
[FilterOutputStream.close]: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterOutputStream.html#close%28%29
Run Code Online (Sandbox Code Playgroud)
请指教.提前致谢.
我使用maven JaxB插件从XSD生成源。
插件的详细信息如下,
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.3</version>
Run Code Online (Sandbox Code Playgroud)
XSD中定义的枚举有两个值,
<simpleType name="MyEnum">
<restriction base="xsd:string">
<enumeration value="SimpleText" />
<enumeration value="ComplexText" />
</restriction>
</simpleType>
Run Code Online (Sandbox Code Playgroud)
生成的代码在枚举值的工作边界之间添加下划线。例如:“ SimpleText”在枚举中为SIMPLE_TEXT。
生成的代码,
@XmlType(name = "MyEnum")
@XmlEnum
public enum MyEnum {
@XmlEnumValue("SimpleText")
SIMPLE_TEXT("SimpleText"),
@XmlEnumValue("ComplexText")
COMPLEX_TEXT("ComplexText");
private final String value;
MyEnum(String v) {
value = v;
}
public String value() {
return value;
}
public static MyEnum fromValue(String v) {
for (MyEnum c: MyEnum.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
Run Code Online (Sandbox Code Playgroud)
}
当枚举在不同位置用下划线分隔相同文本时,会出现此问题。例如
<simpleType name="MyEnum">
<restriction base="xsd:string"> …
Run Code Online (Sandbox Code Playgroud) bash脚本上的字符串连接对逗号","字符不起作用.
A="Hello";
B=",World";
C=$A$B
echo $C;
Run Code Online (Sandbox Code Playgroud)
它将输出打印为
你好,世界
Bash版本是:
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
相同的代码似乎在这里工作