Avatar
0
Vo Thanh Vuong Beginner
Vo Thanh Vuong Beginner
Phân quyền trong spring
Trong thymleaf e có đoạn phân role như này: nhưng nó ko nhận thì lỗi là do ở bên Java e code chưa có quyền hay sao ạ. <p> Nếu đúng thì f12 sẽ ko có đoạn sec:authorize= như ảnh nữa ạ </p> <img src="https://stackask.com/wp-content/uploads/2023/02/aa.png" alt="" class="alignnone size-full wp-image-9535" /> <p> Cho e hỏi lỗi này là do e config bên thymleaf chưa đủ hay do bên BE e chưa set đúng role hay sao ạ. </p> <p> E có khai báo <pre> xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity"</pre> và dependency <pre>thymeleaf-extras-springsecurity4</pre> </p>
Answer
Avatar
1
Vo Thanh Vuong Beginner
Vo Thanh Vuong Beginner
Gen database bằng code java sử dụng các anotation
Khi em làm 1 project nào đó, Em thường tạo bảng bằng cách gen code entity và dùng những annotation @ManyToOne, @OneToMany, @OneToOne. Em không biết là nó có ảnh hưởng tới những cái gì không ạ.
Answer
Avatar
0
Vo Thanh Vuong Beginner
Vo Thanh Vuong Beginner
Query trong Spring
Khi em làm api về filter. Vdu: filter theo name, status, type. Những cái này có thể truyền vào hoặc không. Em thường tạo 1 DAO và dùng Hibernate EntityManager. Tạo câu query dùng if để check những trường name, status, type có empty không và gán vào câu truy vấn. Em thấy có nhiều cách khác nữa nhưng e k nắm. Nếu có cách nào hiệu quả hơn nhờ a chỉ giúp e với ạ.
Answer
Avatar
1
Lâm Văn Đời Beginner
Microservices dùng Spring
<blockquote>Hi anh, em có thời gian rãnh nên vào đọc lại câu hỏi này  <a href="https://stackask.com/question/login-trong-he-thong-microservices-voi-spring/">https://stackask.com/question/login-trong-he-thong-microservices-voi-spring/</a>  để có thêm kiến thức để làm 1 hệ thống Microservices bằng Spring để rèn luyện thêm.</blockquote> <p> Em rất muốn tự làm 1 cái app đơn giản (FE dùng <em><strong>ReactJS</strong></em>, BE dùng <em><strong>SpringBoot</strong></em>) đơn giản có đầy đủ các chức năng cơ bản như login = account của hệ thống, login = google, Facebook, áp dụng cả Kafka hoặc RabbitMQ để làm 1 chức năng gì đó (Hiện em chỉ biết mỗi chức năng gửi mail mà ko biết hệ thống thật có dùng ko :D ), Redis để cache,các service trong hệ thống trao đổi thông tin với nhau ..... với mô hình Microservices. </p> <p> </p> <p> Nên em cho em thắc mắc thêm vài câu hỏi về chủ đề này: </p> <ol> <li>Message Queue ( Kafka, RabbitMQ,....) thường dùng để <strong>làm những gì</strong> trong hệ thống Microservices.</li> <li>Theo câu trả lời của anh thì em hiểu 1 service có nghĩa là có UI và cả BE luôn đúng ko ạ ? Nhưng App  em đang muốn là chỉ có 1 UI là ReactJS thôi. Client (ReactJS) sẽ call đến Api gateway (AG) và AG gọi đến service authen để check token và nếu token verify ok thì sẽ gọi đến các service khác để lấy data trả về cho client (khái niệm service theo em đang hiểu là web service chỉ gửi request và nhận response với data kiểu JSON, nếu em có hiểu sai thì mong anh chỉ em lại).<strong>Nếu như vậy thì câu hỏi của em là service tập trung như anh nói ở trên thì có liên quan gì đến cơ chế oauth2 hay ko a ? (em đang rất rối về cái cơ chế Oauth2 này trong hệ thống Microservices, có thật sự cần thiết để dùng cơ chế này hay không ). Mong anh có thể nói rõ hơn dựa vào ví dụ của em nêu ở trên để em hiểu thêm về service authen tập trung như anh nói để có thể login bằng nhiều cách với hệ thống Microservices.Em đang muốn dùng 100% thư viện của Spring để viết tất cả các service này.</strong></li> <li>Mong a suggest thêm 1 số công nghệ và các chức năng cơ bản hay ho của hệ thống Microservices để em có thể học tập và làm theo.</li> </ol> <p> Rất cảm ơn anh về tâm huyết của anh trong các câu trả lời ! </p>
Answer
Avatar
0
anaconda875 Beginner
anaconda875 Beginner
Spring weblux how to share data from Controller to Filter using Context
<div class="votecell post-layout--left"> <div class="js-voting-container d-flex jc-center fd-column ai-stretch gs4 fc-black-200"></div> </div> <div class="postcell post-layout--right"> <div class="s-prose js-post-body"> <p> </p> <p> In controller I need to share some data to WebFilter (I don't want to use <code>ServerWebExchange.getAttributes().put("KEY", "VALUE")</code>, and my boss either), this is my current implemetation: </p> <pre class="lang-java s-code-block">&lt;code&gt;&lt;span&gt;@Component&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;RequestFilter&lt;/span&gt; &lt;span&gt;implements&lt;/span&gt; &lt;span&gt;WebFilter&lt;/span&gt; { &lt;span&gt;@Override&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; Mono&lt;Void&gt; &lt;span&gt;filter&lt;/span&gt;&lt;span&gt;(ServerWebExchange exchange, WebFilterChain chain)&lt;/span&gt; { exchange.getResponse().beforeCommit(() -&gt; Mono.deferWithContext(c -&gt; { &lt;span&gt;//I CHECK WHETHER DATA SHARED FROM CONTROLLER EXIST OR NOT&lt;/span&gt; System.out.println(c.hasKey(&lt;span&gt;"abc"&lt;/span&gt;)); &lt;span&gt;Context&lt;/span&gt; &lt;span&gt;innerContext&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; c.get(&lt;span&gt;"CONTEXT"&lt;/span&gt;); System.out.println(innerContext.hasKey(&lt;span&gt;"abc"&lt;/span&gt;)); &lt;span&gt;return&lt;/span&gt; Mono.empty(); })); &lt;span&gt;ServerHttpRequest&lt;/span&gt; &lt;span&gt;request&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; exchange.getRequest(); &lt;span&gt;BodyCaptureExchange&lt;/span&gt; &lt;span&gt;bodyCaptureExchange&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;BodyCaptureExchange&lt;/span&gt;(exchange); &lt;span&gt;return&lt;/span&gt; chain.filter(bodyCaptureExchange).subscriberContext(context -&gt; { &lt;span&gt;//HERE I PUT CONTEXT TO ITSELF&lt;/span&gt; context = context.put(&lt;span&gt;"CONTEXT"&lt;/span&gt;, context); &lt;span&gt;return&lt;/span&gt; context; }); } }&lt;/code&gt; Here is my controller method:</pre> <pre class="lang-java s-code-block">&lt;code&gt;&lt;span&gt;public&lt;/span&gt; Mono&lt;ResponseEntity&lt;Response&gt;&gt; &lt;span&gt;post&lt;/span&gt;&lt;span&gt;(&lt;span&gt;@RequestBody&lt;/span&gt; Mono&lt;Request&gt; request)&lt;/span&gt; { Mono&lt;ResponseEntity&lt;Response&gt;&gt; responseEntityMono = request.flatMap( rq -&gt; service.requestProcess(rq).map(res -&gt; ResponseEntity.ok().body(res)) ).subscriberContext(c -&gt; { &lt;span&gt;//HERE I GET THE INNER CONTEXT FROM ABOVE FILTER&lt;/span&gt; &lt;span&gt;Context&lt;/span&gt; &lt;span&gt;innerContext&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; c.get(&lt;span&gt;"CONTEXT"&lt;/span&gt;); &lt;span&gt;//PUT DATA TO IT&lt;/span&gt; c = c.put(&lt;span&gt;"CONTEXT"&lt;/span&gt;, innerContext.put(&lt;span&gt;"abc"&lt;/span&gt;, &lt;span&gt;"abc"&lt;/span&gt;)); &lt;span&gt;//ALSO PUT DATA TO PARENT&lt;/span&gt; c = c.put(&lt;span&gt;"abc"&lt;/span&gt;, &lt;span&gt;"abc"&lt;/span&gt;); &lt;span&gt;return&lt;/span&gt; c; }); &lt;span&gt;return&lt;/span&gt; responseEntityMono; }&lt;/code&gt; </pre> <p> The System.out.println in RequestFilter print: </p> <pre class="lang-java s-code-block">&lt;code&gt;&lt;span&gt;false&lt;/span&gt; &lt;span&gt;false&lt;/span&gt; &lt;/code&gt;</pre> <p> Means that data I put from controller are lost when it come to Filter.  Please correct me if I'm wrong somewhere. I really need your help </p> <p> </p> <p> Reactor version: 3.3.14 </p> <p> </p> <p> Spring boot stater webflux: 2.3.9.RELEASE </p> <p> </p> </div> </div>
Answer
Avatar
1
Lâm Văn Đời Beginner
Login trong hệ thống microservices với Spring
Em đang muốn làm chức năng xác thực (login) bằng account của hệ thống và cũng như xác thực bằng account <em><strong>Facebook, Google </strong></em>trong hệ thống <em><strong>Microsevices</strong></em> viết bằng Spring<em><strong>. </strong></em>Cái này nếu làm dự án Monolithic thì em OK còn khi với hệ thống microservices thì em chưa có solution.Mong anh Dũng và mọi người gợi ý giúp em cách làm về chức năng login kiểu này vừa account hệ thống vừa social account.Có thể là cách phổ biến mà mọi người hay dùng chứ chưa cần phức tạp như các hệ thống lớn đâu ạ. <p> </p> <p> Cảm ơn mọi người </p>
Answer
Avatar
1
Lâm Văn Đời Beginner
Xác thực trong hệ thống microservices
Hi mọi người, <p> </p> <p> Sau 1 thời gian ngắn tìm hiểu về Microservices với Spring Boot cũng như Spring Cloud thì em thấy đối với chức năng login xác thực người dùng thì đa số sẽ có 1 <strong>Api Gateway</strong> (Em đang dùng <strong>Spring cloud gateway</strong>) nhận tất cả request và xác thực 1 bên thứ 3 mà em thấy nhiều ví dụ nhất là <strong>KeyCloak.</strong> </p> <ol> <li>Cho em hỏi là ở thực tế thì trong hệ thống <em><strong>microservices</strong></em> thì các cách, giải pháp triển khai <em><strong>authentication</strong></em> và <em><strong>authorization</strong></em> như thế nào ạ ?</li> <li>Em hiện tại ko muốn xác thực thông qua Keycloak mà em muốn viết logic để xác thực bằng Spring và lưu user của hệ thống ở DB của ta thay vì lưu ở Keycloak thì có ổn ko ạ ? Tại vì theo e nghĩ ở dự án thực tế chả ai lưu user của mình ở Keycloack cả.</li> <li>Nếu có 1 con Gateway thì các service khi gọi nội bộ với nhau thì có cần xác thực ko ạ ?</li> <li>Em đang muốn làm chức năng xác thực (login) bằng account của hệ thống và cũng như xác thực bằng account <em><strong>Facebook, Google. </strong></em>Cái này nếu làm dự án Monolithic thì em OK còn khi với hệ thống microservices thì em chưa có solution.Mong anh Dũng và mọi người gợi ý giúp em cách làm về chức năng login kiểu này vừa account hệ thống vừa social account.</li> </ol> <p> Tks mọi người ! </p>
Answer
Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
[Duplicated]có nên training Servlet trước Spring
hi anh, dạo này em bận vì em được giao training nhóm fresher công ty nên k hỏi nhiều như trước. Em muốn hỏi có nên  training servlet trước khi học spring k vì theo em, nền tảng spring là servlet nên em muốn day các em ý có gốc rễ cho vững vàng ạ
Answer
Avatar
1
Bảo Ngô Beginner
Bảo Ngô Beginner
Java Spring rate limiter block specific duration when ratio reached
Currently I have a requirement: Apply rate limiter for an API. If this API get called over 100 times per 5 sec then the API will be blocked for 10 mins. I don't know if there is any java lib can fullfill this requirement. If the requirement is "Allow 100 calls per 5 sec" or "Allow 100 calls per 10 min" then I can either user Bucket4j: <p> </p> <p> </p> <pre> Bandwidth b = Bandwidth.classic(100, Refill.intervally(100, Duration.ofSeconds(5))); //Bandwidth b = Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(10))); Bucket bk = Bucket.builder().addLimit(b).build(); //then if(bk.tryConsume(1)) { //stuff } else { throw } </pre> <p> </p> <p> or Resilence4j: </p> <p> </p> <pre> RateLimiterConfig config = RateLimiterConfig.custom() .limitRefreshPeriod(Duration.ofSeconds(5)) .limitForPeriod(100) .timeoutDuration(Duration.ofSeconds(1)) .build(); RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config); RateLimiter rateLimiterWithCustomConfig = rateLimiterRegistry .rateLimiter("name2", config); CheckedRunnable restrictedCall = RateLimiter .decorateCheckedRunnable(rateLimiterWithCustomConfig, this::doStuff); //then Try.run(restrictedCall).onFailure(this::throwEx) </pre> <p> </p> <p> But the requirement is "Allow 100 calls per 5 sec, if more, block 10 min". Is there any lib can work? Please suggest me a solution for this case. Thank you </p>
Answer
Avatar
2
Hihi Teacher
Hihi Teacher
Hỏi về đồng bộ trong Java
Hi xin chào mọi người, <p> </p> <p> Em có 1 ví dụ với ứng dụng banking trong <strong>Spring Boot</strong> như sau : </p> <p> </p> <p> Account A hiện đang có 1000$ ( lưu ở DB ) </p> <p> </p> <p> Có 2 request yêu cầu nạp tiền cùng 1 thời điểm tại account A với số tiền lần lượt là 200$ và 400$ </p> <p> </p> <em><strong>=&gt; Nếu đúng thì accout A sẽ có 1600$</strong></em> <p> </p> <p> Tuy nhiên trong lúc yêu cầu đầu tiên chưa update DB lại tổng tiền mới (1000$ +200$ = 1200$) thì yêu cầu thứ 2 đang chạy song song <strong>lấy tổng tiền cũ từ DB</strong> nên cũng update dựa trên tổng tiền cũ ( 1000$ + 400$ = 1400$ ) </p> <p> </p> <em><strong>=&gt; Tổng tiền mới sau 2 luồng chạy  xong là 1400$ thay vì 1600$. 200$ của luồng 1 do update trước nên bị mất.</strong></em> <p> </p> <p> Em nghĩ trong Spring Boot nếu chúng ta không lock 1 account khi account đó trong quá trình xử lí thì sẽ gây ra hậu quả như trên. </p> <p> </p> <p> Em nghĩ trường hợp như trên trong thực tế cũng có thể xảy ra ạ.Giải pháp xử lí tình trạng trên trong thực tế với <strong>Spring Boot</strong> là như thế nào ạ ? </p> <p> </p> <em> Em có suy nghĩ đến synchronize nhưng nếu dùng synchronize thì có vẻ ko đúng cho lắm vì có thể nó sẽ lock luôn các luồng của account khác.Em muốn chỉ lock đúng accout mà đang xử lí thôi còn account khác thì cho chạy bình thường.</em>
Answer
Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
callback trong Java của Android và Spring
Anh ơi, em có một thắc mắc là ngày xưa em có code Android với Java thì họ hay code theo format callback với Interface như thế này : <p> </p> <pre> private void setTextWatcher() { mSalaryEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} /** * khi nhập từng con số nhập lương, gọi vợ và đưa lương */ @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { try { if (!charSequence.toString().isEmpty()) { int salary = Integer.parseInt(charSequence.toString()); callWifeAndGiveSalary(salary); } else { callWifeAndGiveSalary(0); } } catch (NumberFormatException e) { mSalaryEditText.setError("Lương nhiều quá, vợ không dám nhận :v"); } @Override public void afterTextChanged(Editable editable) {} } }); } </pre> <p> </p> <p> Callback là ta sẽ tạo 1 listener lắng nghe event xảy ra khi người dùng click vào một button hoặc 1 tác vụ nào đó. Vậy vì sao Spring không sử dụng callback để nhận event ạ</div> </p>
Answer
Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
cách thay đổi file app.properties trong Spring boot
anh ơi, App.properties là 1 file để lưu các config, địa chỉ IP, username, password của DB... vậy sau khi build file jar từ app, em muốn đổi username trong app.properties thì làm như thế nào. Nếu sửa trong code thì phải build lại file jar mới
Answer