我知道保护REST API是一个广泛评论的主题,但我无法创建符合我的标准的小型原型(我需要确认这些标准是现实的).如何保护资源以及如何使用Spring安全性有很多选择,我需要澄清我的需求是否切合实际.
我的要求
当前状态
我的REST API运行良好,但现在我需要保护它.当我在寻找解决方案时,我创建了一个javax.servlet.Filter
过滤器:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
Account account = accountDao.find(accessToken);
if (account == null) {
throw new UnauthorizedException();
}
chain.doFilter(req, res);
}
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案javax.servlet.filters
不能正常工作,因为@ControllerAdvice
Spring 存在异常处理问题servlet dispatcher
.
我需要的
我想知道这些标准是否切合实际并获得任何帮助,如何开始使用Spring Security保护REST API.我阅读了许多教程(例如Spring Data REST + Spring Security),但都在非常基本的配置中工作 - 具有凭据的用户在配置 …
我有这个 Zustand 存储来存储有关登录用户的身份验证信息。
const authStore = (set: any) => ({
...initialState,
doLogin: async (user: TLoggedInRequest) => {
try {
set(() => ({status: "pending"}))
const result = await loginService.login(user)
set(() => ({
status: "resolved",
user: result?.data.user,
error: null
}))
} catch (error) {
console.log("rejected error", error)
set((state: any) => ({status: "rejected", error}))
}
},
doLogout: async () => {
await loginService.logout()
set(() => initialState)
history.push("/")
}
});
Run Code Online (Sandbox Code Playgroud)
这是HTTPApiClient
使用 Axios 与 REST API 进行通信的 GET 方法的示例(为了简洁,其余部分省略)。
async get<TResponse>(path: string): Promise<TResponse> …
Run Code Online (Sandbox Code Playgroud) 我在数据访问对象中有一个Java方法.这个非常简单的方法将两个整数值插入数据库.
public void saveHourMin(int hour, int min) throws SQLException{
psInsert.setInt(1, hour);
psInsert.setInt(2, min);
psInsert.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)
这个方法,或者一般来说,任何DAO方法,抛出SQLException时是抛出异常,还是应该捕获并记录异常,然后通过返回代码通知用户?使用Spring的应用程序的正确方法是什么?
我正在尝试plain text
使用Thymeleaf从Spring应用程序发送电子邮件.
这是我的电子邮件服务:
@Override
public void sendPasswordToken(Token token) throws ServiceException {
Assert.notNull(token);
try {
Locale locale = Locale.getDefault();
final Context ctx = new Context(locale);
ctx.setVariable("url", url(token));
// Prepare message using a Spring helper
final MimeMessage mimeMessage = mailSender.createMimeMessage();
final MimeMessageHelper message = new MimeMessageHelper(
mimeMessage, false, SpringMailConfig.EMAIL_TEMPLATE_ENCODING
);
message.setSubject("Token");
message.setTo(token.getUser().getUsername());
final String content = this.textTemplateEngine.process("text/token", ctx);
message.setText(content, false);
mailSender.send(mimeMessage);
} catch (Exception e) {
throw new ServiceException("Token has not been sent", e);
}
}
Run Code Online (Sandbox Code Playgroud)
电子邮件被发送并发送到邮箱.
这是我的plain text …
我JSR-303
在我的 Spring 应用程序中进行验证,它可以根据需要工作。
这是一个例子:
@Column(nullable = false, name = "name")
@JsonProperty("customer_name")
@NotEmpty
@Size(min = 3, max = 32)
private String name;
Run Code Online (Sandbox Code Playgroud)
REST API 客户端customer_name
用作输入字段的名称,发送到 API 芽验证字段错误org.springframework.validation.FieldError
返回name
作为字段的名称。
有什么方法可以获取JSON-ish
在 中指定的名称@JsonProperty
吗?或者我是否必须实现自己的映射器来将类字段名称映射到其 JSON 替代方案?
Edit1:将类字段重命名为与 JSON 名称对应的名称是不可替代的(出于多种原因)。
是否允许/在一个方法上有多个 @Scheduled 注释?
@Scheduled(cron = "0 5 0 * * *", zone = "Europe/Stockholm")
@Scheduled(fixedRate = 1000 * 60 * 20, initialDelay = 1000 * 60 * 5)
public void setSalariesAsArchived() {
//...
}
Run Code Online (Sandbox Code Playgroud) 这两种设计模式有什么区别?它似乎与我非常相似,一个处理单元(层或过滤器)执行一些数据处理并将数据拉/推入另一个处理单元.单元n
仅与单元通信n+1
,n-1
单元有定义一个特定单元提供的功能的接口.
有什么区别?
编辑:也许一个区别应该是数据流.在层流可以是top-down
,bottom-up
和/或通信between
的一些层的内部.在管道和过滤器中,数据流从单元开始1
并转到单元n
(而不是返回).
我通过java.util.Calendar获取有关Java中特定日期的信息(例如一周,一个月,一年中的一天).在我的情况下,是否有某些理由为日历对象设置区域设置?我问是因为:
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
Run Code Online (Sandbox Code Playgroud)
今天(星期日)的返回值始终为1,但在我们的区域设置(cs_CZ)中,它应为7.
Locale locale = new Locale("cs", "CZ");
TimeZone tz = TimeZone.getTimeZone("Europe/Prague");
Calendar cal = GregorianCalendar.getInstance(tz, locale);
cal.setTime(new Date());
// returns => 1 (but I expected 7)
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
// returns => 3 - it's OK
System.out.println(cal.get(Calendar.DAY_OF_MONTH));
Run Code Online (Sandbox Code Playgroud)
编辑:我可以在周日使用1,但我必须确保这是不变的行为,无论使用Locale还是TimeZone.
如何在没有onClick回调函数的情况下创建链接的正确/标准方法是什么URL
?
<a href="#" onClick={this.handleClick}>click me!</a>
Run Code Online (Sandbox Code Playgroud)
或者没有href
,但是链接在视觉上是不可点击的:
<a onClick={this.handleClick}>click me!</a>
Run Code Online (Sandbox Code Playgroud)
所有教程,我看过了,工作与其他元素比<a>
-点击<span>
,<div>
等等.但我想用<a>
.
HTML文件中这两个JavaScript实现之间有什么区别?
<script src="foo.js" type="text/javascript"></script>
正如Google Analytics以编程方式执行此操作:
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ?
'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
Run Code Online (Sandbox Code Playgroud)浏览器加载/呈现HTML页面的方式是否有任何差异,或者缓存此类JS脚本的连接是否存在一些差异?
java ×5
javascript ×3
spring ×3
reactjs ×2
architecture ×1
axios ×1
calendar ×1
components ×1
dao ×1
date ×1
email ×1
html ×1
java-ee ×1
locale ×1
mapping ×1
plaintext ×1
rest ×1
spring-boot ×1
thymeleaf ×1
validation ×1
zustand ×1