我正在使用JWT令牌开发端到端应用程序UI Angular、后端Spring Boot。
它达到了我的方法jwtFilter从邮递员和角度。
在jwtFilter之后,我的postman请求到达createJWTtoken方法
从角度来看,它没有到达创建令牌方法,它返回200 OK响应。
Angular将我的请求作为选项提交
角度计程仪
config.JwtRequestFilter : JWT Token does not begin with Bearer String
DispatcherServlet : ***OPTIONS*** "/myapp/authenticate", parameters={}
RequestMappingHandlerMapping : Mapped to com.myapp.controller.JwtAuthenticationController#createAuthenticationToken(JwtRequest)
DispatcherServlet : Completed 200 OK
来自邮递员日志的请求
config.JwtRequestFilter : JWT Token does not begin with Bearer String
DispatcherServlet : ***POST*** "/myapp/authenticate", parameters={}
RequestMappingHandlerMapping : Mapped to com.myapp.controller.JwtAuthenticationController#createAuthenticationToken(JwtRequest)
RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [com.myapp.model.security.JwtRequest@8d233a8]
JwtAuthenticationController : Creating jwt token
StatisticsImpl : HHH000117: HQL: select generatedAlias0 from Users as generatedAlias0 where generatedAlias0.userName=:param0, time: 297ms, rows: 1
HttpEntityMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json, application/x-jackson-smile, application/cbor]
HttpEntityMethodProcessor : Writing [com.myapp.model.security.JwtResponse@2127c1d5]
DispatcherServlet : Completed 200 OK
**@覆盖受保护的void doFilterInternal(HttpServletRequest请求、HttpServletResponse响应、FilterChain链)引发ServletException、IOException{
final String requestTokenHeader = request.getHeader("Authorization");
String username = null;
String jwtToken = null;
if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
jwtToken = requestTokenHeader.substring(7);
try {
username = jwtTokenUtil.getUsernameFromToken(jwtToken);
} catch (IllegalArgumentException e) {
System.out.println("Unable to get JWT Token");
} catch (ExpiredJwtException e) {
System.out.println("JWT Token has expired");
}
} else {
logger.warn("JWT Token does not begin with Bearer String");
}
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username);
if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}
chain.doFilter(request, response);//Both postman and angular reach this point.
}**
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable()
.authorizeRequests().antMatchers("/authenticate", "/myapp/authenticate").permitAll().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.anyRequest().authenticated().and().
exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}
角度post调用
public baseUrl = 'http://localhost:8081/myapp/authenticate';
public callService(userInfo:User){
var username=userInfo.username;
var password = userInfo.password;
return this.http.post(this.baseUrl,
{
'username': username,
'password': password
},
{ headers: new HttpHeaders({
'Content-Type': 'application/json',
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Origin, Content-Type, Accept, Access-Control-Allow-Origin',
}), observe: 'response'}
).pipe(
map(userData => {
sessionStorage.setItem("username", username);
let tokenStr = "Bearer " + '';
console.log(tokenStr);
sessionStorage.setItem("token", tokenStr);
return userData;
})
);
}
代理配置。json
{
"/api": {
"target": "http://localhost:8080/",
"changeOrigin": true,
"secure": false,
"pathRewrite": {
"^/api": ""
}
}
}
发布飞行前选项请求的不是角度,而是您的浏览器。检查此Angular$超文本传输协议正在发送选项而不是PUT/POST
结论:您必须在spring boot中修复CORS策略,以及spring boot如何处理安全配置中的选项请求。你能在你的问题中添加这部分代码吗。
我是Angular的新手,我来自灰烬社区。尝试使用基于Ember-CLI的新Angular-CLI。 我需要知道在一个新的项目中处理SASS的最佳方法。我尝试使用repo来查看它是否可以继续使用,因为Angular-CLI的许多核心组件是从Ember-CLI模块运行的。 它没有工作,但再次不确定是否我只是配置错误的东西。 另外,在一个新的有角度的项目中,组织样式的最佳方法是什么?如果将sass文件
用AngularJS按回车键提交表单这个问题使用html5按钮,但我使用角度材质按钮作为 但是如何使用它呢
问题内容: 我有一个简单的形式,像这样: 与我的控制器如下: 我想做的是在提交后清除文本输入,因此我只需清除模型值: 除了现在,因为“需要”表单输入,所以在表单输入周围出现了红色边框。这是正确的行为,但不是我在这种情况下想要的……所以,我想清除输入,然后模糊输入元素。这导致我: 现在,我知道从这样的控制器修改DOM在Angular文档中是很陌生的-但是还有更多的Angular方式可以做到这一点吗?
我有一个表单,其中我将bands表的de id放在一个选择选项中。当我在dropdownlist中选择一个id并尝试提交表单时,该值始终保持为空。如何检索我选择的值? 创造刀身php文件: 我的BandControlers在我的商店行动:
允许用户通过提供选项页面来自定义扩展的行为。 用户可以通过右键单击工具栏中的扩展图标,然后选择选项,或访问 chrome://extensions 的扩展管理页面,找到所需的扩展,点击“详细信息”,然后选择选项链接来查看扩展的选项。 编写选项页面 下面是一个选项页面示例。 <!DOCTYPE html> <html> <head><title>My Test Extension Options</
问题内容: 有人知道如何清除angular中的ui-select框的选定值吗? 我想要select2的功能,其中selectbox中有一个小x。看起来好像没有select2获得的allow-clear方法。 问题答案: 如果您使用的是select2主题,则指令上有一个选项可以为您执行此操作。您将在右侧看到x,可以通过单击将其清除。 https://github.com/angular-ui/ui-